Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

Problem z przyjaźnią szablonu klas z szablonem funkcji

Ostatnio zmodyfikowano 2012-07-03 16:57
Autor Wiadomość
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:
C/C++
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.
P-59475
DejaVu
» 2012-07-03 16:29:25
C/C++
template < class typ >
friend ostream & operator <<( ostream & strum, schowek < typ > obj );
P-59476
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:
C/C++
template < class typ > class schowek {
public:
    schowek()
        : x( 0 )
        , y( 0 )
    { }
private:
    typ x, y;
    friend klasa < typ >;
};

P-59477
DejaVu
» 2012-07-03 16:43:05
Można tworzyć zagnieżdżone szablony.
P-59478
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.
P-59479
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ć :)
P-59480
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.
P-59481
« 1 »
  Strona 1 z 1