Модераторы: bsa
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Дружественный метод в шаблонном классе. 
V
    Опции темы
Хоббит
Дата 28.12.2008, 17:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1263
Регистрация: 6.11.2005

Репутация: нет
Всего: 1



Хочу перегрузить оператор << в классе Colleciton, чтобы воводить класс.

friend ostream& operator <<(ostream &stream, Collection<T> collection);

Получаю предупреждение
warning: friend declaration ‘std::ostream& operator<<(std::ostream&, Collection<T>)’ declares a non-template function
warning: (if this is not what you intended, make sure the function template has already been declared and add <> after the function name here) -Wno-non-template-friend disables this warning

И у менять есть выбор.
Либо установить опцию компилятора, либо не делать функцию дружественной.

Что значит это предупреждение и как лучше поступить?

PM MAIL   Вверх
mes
Дата 28.12.2008, 18:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 79
Всего: 250



Цитата(Хоббит @  28.12.2008,  17:41 Найти цитируемый пост)

Что значит это предупреждение и как лучше поступить?

Значит что Вы не можете делать другом шаблона не-шаблонную функцию, принимающую как аргумент шаблон.

Чтоб решить проблему, Вы должны определить шаблоную функцию до шаблона класса. 
А так как они (класс и функция) используют друг друга, то без предопределений не обойтись.
В общем схема такая : 
Код

template <class T> class Container; // предопределение класса 
template <class T> void f(Container<T>&);  // предопределение функции 

template <class T>
class Container 
{
    friend void f<>(Container& f);
};

template <class T> void f(Container<T>&){}




Это сообщение отредактировал(а) mes - 28.12.2008, 21:47


--------------------
PM MAIL WWW   Вверх
nickless
Дата 28.12.2008, 18:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Гентозавр
****


Профиль
Группа: Участник Клуба
Сообщений: 2976
Регистрация: 29.8.2005
Где: Germany

Репутация: 2
Всего: 181



Можно прописать шаблон и сразу в декларации friend, будет меньше писанины.
Код

template <typename T>
class Collection
{
    template<typename U> friend std::ostream & operator <<(std::ostream & stream, const Collection<U> & collection);
};


template <typename T>
std::ostream & operator <<(std::ostream & stream, const Collection<T> & collection)
{
}



--------------------
user posted image

Real men don't use backups, they post their stuff on a public ftp server and let the rest of the world make copies
- Linus Torvalds
PM MAIL   Вверх
UnrealMan
Дата 28.12.2008, 20:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 722
Регистрация: 30.3.2006

Репутация: 5
Всего: 32



Цитата(mes @  28.12.2008,  18:26 Найти цитируемый пост)
Значит что Вы не можете делать другом шаблона не шаблонную функцию.

Неправда.
PM MAIL   Вверх
mes
Дата 28.12.2008, 21:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 79
Всего: 250



Цитата(UnrealMan @  28.12.2008,  20:52 Найти цитируемый пост)
Неправда. 

Подправил.


--------------------
PM MAIL WWW   Вверх
UnrealMan
Дата 28.12.2008, 21:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 722
Регистрация: 30.3.2006

Репутация: 5
Всего: 32



Цитата(mes @  28.12.2008,  21:46 Найти цитируемый пост)
Подправил. 

Цитата(mes @  28.12.2008,  18:26 Найти цитируемый пост)
Значит что Вы не можете делать другом шаблона не-шаблонную функцию, принимающую как аргумент шаблон.

Это ты про шаблонные шаблонные аргументы что ли? smile 
PM MAIL   Вверх
mes
Дата 28.12.2008, 22:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 79
Всего: 250



было написано про такую ситуацию : 
Код

template <class T>
class Collection
{
   friend void f (Collection<T>&);
};



Это сообщение отредактировал(а) mes - 28.12.2008, 22:14


--------------------
PM MAIL WWW   Вверх
UnrealMan
Дата 29.12.2008, 01:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 722
Регистрация: 30.3.2006

Репутация: 5
Всего: 32



Цитата(mes @ 28.12.2008,  22:10)
было написано про такую ситуацию : 
Код

template <class T>
class Collection
{
   friend void f (Collection<T>&);
};

Здесь нет сущностей, принимающих шаблон в качестве параметра.

Это сообщение отредактировал(а) UnrealMan - 29.12.2008, 01:14
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.0555 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.