|
|
|
новичок
      
участник
Last Login: 08.12.2006 21:45
Сообщ.: 5,
Visits: 47
|
|
У меня есть класс типа :template <class T> class array { ... friend std::ostream& operator<< ( std::ostream& output, const array<T>& ); ... };
(Полный код в аттачменте - это слегка модифицированный пример 19.4 из книжки Джеса Либерти "Освой самостоятельно C++ за 21 день". Я компилил Visual C++ 13.10.3077 (VS2003) компилятором с ключами /EHsc /Zc:forScope. Обратите внимание, что если вводить исходные данные таким образом, что вместо двух цифр ввести одну, а потом сразу делимитер (пробел, таб, запятая, семиколон или точка), то функция std::string::at () вызывает out of range exception, и программа падает) Проблема в том, что если определить объявленный другом класса array operator<< как шаблон функции следующим образом:
template <class T> std::ostream& operator<< ( std::ostream& output, const array<T>& rhs ) { // loop invariant: the first i + 1 members of array // put into output buffer for (int i = 0; i < rhs.getSize (); ++i) output << '[' << i << "] " << rhs[i] << std::endl; return output; } , т.е. чтобы он мог вызываться для любого экземпляра класса array, то программа компилируется, но не линкуется. Сообщение компоновщика следующее:
List19_4.obj : error LNK2019: unresolved external symbol "class std::basic_ostream<char,struct std::char_traits<char> > & __cdecl operator<<(class std::basic_ostream<char,struct std::char_traits<char> > &,class array<class animal> const &)" (??6@YAAAV?$basic_ostream@DU?$char_traits@D@std@@@std@@AAV01@ABV?$array@Vanimal@@@@@Z) referenced in function _main List19_4.obj : error LNK2019: unresolved external symbol "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> const &)" (??6@YAAAV?$basic_ostream@DU?$char_traits@D@std@@@std@@AAV01@ABV?$array@H@@@Z) referenced in function _main Debug/List19_4.exe : fatal error LNK1120: 2 unresolved externals
В результате я закомментил в файле вышеуказонное определение шаблона оператора << и просто определил два перегруженных оператора << - для параметра array<int> и для array<animal> соответственно. А как правильно определить именно шаблон для оператора << чтобы работал с любым array<T>?
|
|
|
|