перегрузка оператора вывода в шаблонном классе
От: JohnPreston  
Дата: 13.07.11 08:54
Оценка:
есть шаблонный класс:


template <class T,size_t N>
class Array {
public:
...
friend ostream& operator<<(ostream& t,const Array<T,N>& val);
...
};

template<class T,size_t N>
ostream& operator<<(ostream& t,const Array<T,N>& val){
    for (int i=0;i<N;++i){
        t<<val[i]<<endl;
    }
    return (t<<endl);
}


void main(int argv,char* argc[]){

    Array<int,5> mas(3);

    cout<<mas;
}


error LNK2019: ссылка на неразрешенный внешний символ "class std::basic_ostream<char,struct std::char_traits<char> > & __cdecl operator<<(class std::basic_ostream<char,struct std::char_traits<char> > &,class Array<int,5> const &)" (??6@YAAAV?$basic_ostream@DU?$char_traits@D@std@@@std@@AAV01@ABV?$Array@H$04@@@Z) в функции _main

что не так?
Re: перегрузка оператора вывода в шаблонном классе
От: Centaur Россия  
Дата: 13.07.11 08:59
Оценка:
Здравствуйте, JohnPreston, Вы писали:

JP>error LNK2019: ссылка на неразрешенный внешний символ "class std::basic_ostream<char,struct std::char_traits<char> > & __cdecl operator<<(class std::basic_ostream<char,struct std::char_traits<char> > &,class Array<int,5> const &)" (??6@YAAAV?$basic_ostream@DU?$char_traits@D@std@@@std@@AAV01@ABV?$Array@H$04@@@Z) в функции _main


JP>что не так?


Вынес определение шаблона и/или шаблонных функций в отдельную единицу трансляции, сделав его недоступным для единицы, содержащей main?
Re[2]: перегрузка оператора вывода в шаблонном классе
От: JohnPreston  
Дата: 13.07.11 09:05
Оценка:
Здравствуйте, Centaur, Вы писали:

C>Здравствуйте, JohnPreston, Вы писали:


JP>>error LNK2019: ссылка на неразрешенный внешний символ "class std::basic_ostream<char,struct std::char_traits<char> > & __cdecl operator<<(class std::basic_ostream<char,struct std::char_traits<char> > &,class Array<int,5> const &)" (??6@YAAAV?$basic_ostream@DU?$char_traits@D@std@@@std@@AAV01@ABV?$Array@H$04@@@Z) в функции _main


JP>>что не так?


C>Вынес определение шаблона и/или шаблонных функций в отдельную единицу трансляции, сделав его недоступным для единицы, содержащей main?


эмм... нет, все в одном файле идет
Re: перегрузка оператора вывода в шаблонном классе
От: Erop Россия  
Дата: 13.07.11 09:28
Оценка:
Здравствуйте, JohnPreston, Вы писали:


JP>что не так?


Функция не шаблонная, на самом деле. Так что проще всего будет написать там кроме friend ещё и inline и опредялять функцию прямо там же...
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Re[3]: перегрузка оператора вывода в шаблонном классе
От: night beast СССР  
Дата: 13.07.11 11:41
Оценка:
Здравствуйте, JohnPreston, Вы писали:

JP>>>error LNK2019: ссылка на неразрешенный внешний символ "class std::basic_ostream<char,struct std::char_traits<char> > & __cdecl operator<<(class std::basic_ostream<char,struct std::char_traits<char> > &,class Array<int,5> const &)" (??6@YAAAV?$basic_ostream@DU?$char_traits@D@std@@@std@@AAV01@ABV?$Array@H$04@@@Z) в функции _main


JP>>>что не так?


C>>Вынес определение шаблона и/или шаблонных функций в отдельную единицу трансляции, сделав его недоступным для единицы, содержащей main?


JP>эмм... нет, все в одном файле идет


а если функцию заменить на
ostream& operator<<(ostream& t,const Array<int,5>& val){
    for (int i=0;i<5;++i){
        t<<val[i]<<endl;
    }
    return (t<<endl);
}

?
Re[4]: перегрузка оператора вывода в шаблонном классе
От: JohnPreston  
Дата: 13.07.11 12:02
Оценка:
Здравствуйте, night beast, Вы писали:

NB>Здравствуйте, JohnPreston, Вы писали:


JP>>>>error LNK2019: ссылка на неразрешенный внешний символ "class std::basic_ostream<char,struct std::char_traits<char> > & __cdecl operator<<(class std::basic_ostream<char,struct std::char_traits<char> > &,class Array<int,5> const &)" (??6@YAAAV?$basic_ostream@DU?$char_traits@D@std@@@std@@AAV01@ABV?$Array@H$04@@@Z) в функции _main


JP>>>>что не так?


C>>>Вынес определение шаблона и/или шаблонных функций в отдельную единицу трансляции, сделав его недоступным для единицы, содержащей main?


JP>>эмм... нет, все в одном файле идет


NB>а если функцию заменить на

NB>
NB>ostream& operator<<(ostream& t,const Array<int,5>& val){
NB>    for (int i=0;i<5;++i){
NB>        t<<val[i]<<endl;
NB>    }
NB>    return (t<<endl);
NB>}
NB>

NB>?

слишком много параметров для бинарной операции. она все-таки френдовая должна быть, только шаблон никак не прикручивается
Re[5]: перегрузка оператора вывода в шаблонном классе
От: night beast СССР  
Дата: 13.07.11 12:47
Оценка: +1
Здравствуйте, JohnPreston, Вы писали:

C>>>>Вынес определение шаблона и/или шаблонных функций в отдельную единицу трансляции, сделав его недоступным для единицы, содержащей main?


JP>>>эмм... нет, все в одном файле идет


NB>>а если функцию заменить на

NB>>?

JP>слишком много параметров для бинарной операции. она все-таки френдовая должна быть, только шаблон никак не прикручивается


ну, Егор уже сказал, что чтоб френдовая функция была шаблонной надо <> поставить после названия.
скорее всего еще ее объявление надо будет перед классом поместить.
вобщем, проще прямо в самом классе поместить определение и не мучится.
Re[6]: перегрузка оператора вывода в шаблонном классе
От: Erop Россия  
Дата: 13.07.11 20:56
Оценка:
Здравствуйте, night beast, Вы писали:

NB>ну, Егор уже сказал, что чтоб френдовая функция была шаблонной надо <> поставить после названия.

NB>скорее всего еще ее объявление надо будет перед классом поместить.
NB>вобщем, проще прямо в самом классе поместить определение и не мучится.

Если кто не понял, то я имею в виду, что-то вроде:
#include <iostream>
 
template<typename T>
struct S {
    T F;
    
    friend inline void f( const S<T>& o ) { std::cout << o.F; }
};
 
int main()
{
    S<int> s = { 1 };
    f( s );
    return 0;
}


Второй, не менее прямой, кстати, путь, состоит в том, чтобы написать у класса шаблон публичного метода DumpToStream, параметризованного потоком, и потом завести просто отдельный шаблон operator<< с соответствующими аргументами...
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Re: перегрузка оператора вывода в шаблонном классе
От: Dmi3S Россия http://dmi3s.blogspot.com/
Дата: 16.07.11 01:43
Оценка:
Здравствуйте, JohnPreston, Вы писали:

JP>есть шаблонный класс:

JP>что не так?

JP>
JP>template <class T,size_t N>
JP>class Array {
JP>public:
JP>...
JP>friend ostream& operator<<(ostream& t,const Array<T,N>& val);

template<class U, size_t NN> friend ostream& operator<<(ostream& t,const Array<U,NN>& val);

JP>
void main(int argv,char* argc[]){

int main(int argv,char* argc[]){
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.