Problem z przyjaźnią szablonu klas z szablonem funkcji
Ostatnio zmodyfikowano 2012-07-03 16:57
Dawidsoni Temat założony przez niniejszego użytkownika |
Problem z przyjaźnią szablonu klas z szablonem funkcji » 2012-07-03 16:27:51 Napotkałem jeszcze 1 problem z szablonami klas. W książce "Pasja C++" znów jest podobny przykład, który się kompiluje. Nie widzę też żadnego błędu w tym programie... Tu kod: template < class typ > class schowek { public: schowek() : x( 0 ) , y( 0 ) { } private: typ x, y; friend ostream & operator <<( ostream & strum, schowek < typ > obj ); };
template < class typ > ostream & operator <<( ostream & strum, schowek < typ > obj ) { strum << obj.x << obj.y << endl; return strum; } A błąd taki: 1>main.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 schowek<int>)" (??6@YAAAV?$basic_ostream@DU?$char_traits@D@std@@@std@@AAV01@V?$schowek@H@@@Z) referenced in function _main
Wiem, że jeśli zdefiniuję tą zaprzyjaźnioną funkcję bezpośrednio w szablonie klas, to wszystko działa. Jednak wkurza mnie ten błąd i proszę o wyjaśnienie jego przyczyny i rozwiązanie go. |
|
DejaVu |
» 2012-07-03 16:29:25 template < class typ > friend ostream & operator <<( ostream & strum, schowek < typ > obj ); |
|
Dawidsoni Temat założony przez niniejszego użytkownika |
» 2012-07-03 16:42:08 Dzięki. Pewnie się standard zmienił, bo znów w książce tego nie ma. Reszta na szczęście dotycząca szablonów działa. Znów wydaje mi się to dziwne, bo: 1. Podobno nie może być "template" zagnieżdżone w "template". 2. Przy używaniu przyjaźni 2 szablonów klas, wystarczy taki zapis: template < class typ > class schowek { public: schowek() : x( 0 ) , y( 0 ) { } private: typ x, y; friend klasa < typ >; }; |
|
DejaVu |
» 2012-07-03 16:43:05 Można tworzyć zagnieżdżone szablony. |
|
Dawidsoni Temat założony przez niniejszego użytkownika |
» 2012-07-03 16:50:44 No to już 3 różnica... W książce pisze, że nie można... Mam nadzieje, że więcej takich rzeczy nie ma.
Książka została chyba napisana w 1999 r., więc jeszcze przed C++03. Pewnie właśnie wtedy wprowadzono niewielkie (mam przynajmniej taką nadzieję...) zmiany w szablonach. |
|
DejaVu |
» 2012-07-03 16:53:35 No to starej książki używasz... no ale ważne, że temat dobrze jest wytłumaczony - o resztę zawsze można dopytać :) |
|
Dawidsoni Temat założony przez niniejszego użytkownika |
» 2012-07-03 16:57:11 Niestety nie ma nowszej "Pasji C++", a to najlepsza książka do tego. Symfonię C++ zrobił z C++03, więc w szablonach są pewnie tak małe zmiany, że nawet nie robił nowego wydania Pasji. |
|
« 1 » |