[C++] undefined reference to template friend

0

Witam!

Na wstępie chciałbym zaznaczyć, że dopiero uczę się C++ i jeszcze nic konkretnego w nim nie napisałem.

Chciałem skompilować sobie program wykorzystujący listy z "Pasji C++". Było z nim trochę problemów, ale z pomocą Google sobie poradziłem. Jednak jeden pozostał... Błąd wyskakuje przy linkowaniu.

Kody źródłowe:
lista.cpp - http://www.unit1.pl/pb-995
osoba.h - http://www.unit1.pl/pb-996
lista_poj.h - http://www.unit1.pl/pb-997

Kompiluje za pomocą g++. Oto błędy:

/tmp/cc3iLzzQ.o: In function `main':
lista.cpp:(.text+0x116): undefined reference to `operator<<(std::basic_ostream<char, std::char_traits<char> >&, lista<osoba>&)'
lista.cpp:(.text+0x14d): undefined reference to `operator<<(std::basic_ostream<char, std::char_traits<char> >&, lista<osoba>&)'
lista.cpp:(.text+0x181): undefined reference to `operator<<(std::basic_ostream<char, std::char_traits<char> >&, lista<osoba>&)'
lista.cpp:(.text+0x1c0): undefined reference to `operator<<(std::basic_ostream<char, std::char_traits<char> >&, lista<osoba>&)'
lista.cpp:(.text+0x1f4): undefined reference to `operator<<(std::basic_ostream<char, std::char_traits<char> >&, lista<osoba>&)'
/tmp/cc3iLzzQ.o:lista.cpp:(.text+0x23c): more undefined references to `operator<<(std::basic_ostream<char, std::char_traits<char> >&, lista<osoba>&)' follow
/tmp/cc3iLzzQ.o: In function `main':
lista.cpp:(.text+0x361): undefined reference to `operator<<(std::basic_ostream<char, std::char_traits<char> >&, lista<float>&)'
lista.cpp:(.text+0x3a5): undefined reference to `operator<<(std::basic_ostream<char, std::char_traits<char> >&, lista<float>&)'
collect2: ld returned 1 exit status

Pozdrawiam i czekam na propozycje rozwiazania problemu :).

PS Wersja g++ to 4.4.0.

0

Brakuje ci definicji operator<<(ostream&, lista<osoba>&)...

0

Definicja jest na samym końcu pliku lista_poj.h:

template <class typOBJ>
ostream& operator<<(ostream& s, lista<typOBJ> &spis)
{
        //typename lista<typOBJ>::wezel* skoczek = spis.pierwszyW;
        for(int i = 0; spis.pierwszyW; i++, spis.pierwszyW = spis.pierwszyW->nastepca)
        {
                s << i << ") "
                        << *(spis.pierwszyW->wskobj) << "   ";
        }
        s << endl ;
        return s;
}

//quetz: wlasnie sie do niej dokopalem..

0

Twoja deklaracja operatora w klasie nie jest template'em, mimo ze Tobie wyglada tak jak by byla.. taki haczyk jezyka..
Twoja pozniejsza definicja tegoz operatora jest template'm - prawidlowo. Ale kompilator jej nie zauwaza, bo spodziewa sie ze ta funkcja template'm nie jest

patrz: http://www.parashift.com/c++-faq-lite/templates.html sekcja [35.16]

1 użytkowników online, w tym zalogowanych: 0, gości: 1