Andrzej Orkan Napisano Grudzień 10, 2004 Zgłoszenie Share Napisano Grudzień 10, 2004 Słuchajcie, mam taki prościutki programik - i mam problemy z operatorem << a właściwie z jego przeciążaniem względem obiektów klasy template. Zresztą zobaczcie sami: ---------------------------------------------------------------------------------------------------- #include <iostream> using namespace std; template<class typA> class contain { private: typA inside; // jedyny prywatny składnik klasy public: void put(typA x) // funkcja put wpisuje do inside { inside = x; } friend ostream& operator<<(ostream & out, contain<typA>& x); //deklaracja operatora << }; template <class typA> //definicja operatora << ostream& operator<<(ostream & out, contain<typA>& x) { return out << x.inside << endl; } int main(void) { contain<int> a; a.put(3); cout << a; // ????? - TU WŁAŚNIE WYKRZACZA MI SI PROGRAM! return 0; } ------------------------------------------------------------------------------------------------ to wszystko w jednym pliku - poj.cpp No i gdy robię g++ poj.cpp to oprócz dwóch warningów wywala mi błąd: /tmp/cc79xTmT.o(.text+0x136): In function `main': : undefined reference to `operator<<(std::basic_ostream<char, std::char_traits<char> >&, contain<int>&)' collect2: ld returned 1 exit status Ktoś wie o co może chodzić? Od razu zaznaczam że nawet dołączenie konstruktora, destruktora i konstruktora kopiującego napisanych w podobnym stylu nie naprawia problemu. Bardzo proszę o pomoc wyjadaczy C++ pozdrówka dla wszystkich Orkan Odnośnik do komentarza Udostępnij na innych stronach More sharing options...
rpbyc Napisano Grudzień 10, 2004 Zgłoszenie Share Napisano Grudzień 10, 2004 A jak zdefiniujesz operator << wewnątrz klasy to działa? Odnośnik do komentarza Udostępnij na innych stronach More sharing options...
Andrzej Orkan Napisano Grudzień 10, 2004 Autor Zgłoszenie Share Napisano Grudzień 10, 2004 Działa, zgoda, ale to mnie zmusza do ustanowienia metody operator<< jako funkcji inline. Skrajna nieoszczędność pamięci. Czy tak zdefiniowana metoda musi być CZŁONKIEM klasy template? Orkan Odnośnik do komentarza Udostępnij na innych stronach More sharing options...
perbeatus Napisano Grudzień 14, 2004 Zgłoszenie Share Napisano Grudzień 14, 2004 Moim skromnym zdaniem ten program nie będzie działał zjednego względu. Postaw się w miejscu kompilatora. Jadąc od góry definiujesz mu funkcję operator<< on już wie że ma zapisywać nim zapisywać do obiektu inside. A potem wywołujesz mu cout << a No i on biedny myśli że ci chodzi o funkce którą zdefiniowałeś bo na tym właśnie polega overloading funkcji. Rozwiązanie? Faktycznie możesz zdefiniować funkcję w klasie albo jeśli nie to musisz poinformować kompilator o jaką funkcję ci chodzi przy wywołaniu cout << a; chyba bedzie dobrze jak zrobisz cout std::<< a; ale nie ręcze w kazdym razie costakiego. Odnośnik do komentarza Udostępnij na innych stronach More sharing options...
Sanczo Napisano Grudzień 15, 2004 Zgłoszenie Share Napisano Grudzień 15, 2004 Witam friend ostream& operator<<(ostream & out, contain<typA>& x); Spróbuj: Deklaracja: friend ostream& operator<<(ostream & out, const contain& x); Treść funkcji: ostream& operator<<(ostream & out,const contain& x) {out<<x.inside<<endl; return out; } Moze (_pomuc_ → pomóc) ORT ale nie obiecuje Blad (_napewno_ → na pewno) ORT tkwi w funkcji operator<< nie ma co szukać w konstruktorach ani w destruktorach. powodzenia Odnośnik do komentarza Udostępnij na innych stronach More sharing options...
PeterJack Napisano Grudzień 15, 2004 Zgłoszenie Share Napisano Grudzień 15, 2004 Kiedyś troche pisałem w c++ Moim skromnym zdaniem nie zadeklarowałeś bibliotek z których ma on korzystać w inculde (czyli na samej górze) poczytaj jakieś tutoriale o c++ Odnośnik do komentarza Udostępnij na innych stronach More sharing options...
Sanczo Napisano Grudzień 15, 2004 Zgłoszenie Share Napisano Grudzień 15, 2004 Kiedyś troche pisałem w c++ Moim skromnym zdaniem nie zadeklarowałeś bibliotek z których ma on korzystać w inculde (czyli na samej górze) poczytaj jakieś tutoriale o c++ Wyzej wymieniony problem dotyczy raczej konstrukcji operator<<, Dla satysfakcji możesz dodać jeszcze: #include <cstdlib> nad name space stdl; Odnośnik do komentarza Udostępnij na innych stronach More sharing options...
Andrzej Orkan Napisano Grudzień 18, 2004 Autor Zgłoszenie Share Napisano Grudzień 18, 2004 Dzięki Sanczo, problem już rozwiązałem metodą prób i błędów - doszedłem. Żadnych nowych bibliotek nie trzeba. Wystarczy zadeklarować ten operator jeszcze raz poza klasą jako prototyp funkcji globalnej. Jedna linijka a tyle radości Jeśli chcesz - służę szczegółami. Dzięki jeszcze raz i pozdrawiam, Orkan Odnośnik do komentarza Udostępnij na innych stronach More sharing options...
Sanczo Napisano Grudzień 19, 2004 Zgłoszenie Share Napisano Grudzień 19, 2004 Zawsze do usług Ja osobiście wyznaje i polecam metode programowania obiektowego na 3 plikach: main.cpp (test obiektu), stos.cpp (definicja funkcji i metod np stos), stos.h (header) - czyli dołanczanie modułów:) Wyślij mi kod na [email protected] pozdrawiam Odnośnik do komentarza Udostępnij na innych stronach More sharing options...
Rekomendowane odpowiedzi
Jeśli chcesz dodać odpowiedź, zaloguj się lub zarejestruj nowe konto
Jedynie zarejestrowani użytkownicy mogą komentować zawartość tej strony.
Zarejestruj nowe konto
Załóż nowe konto. To bardzo proste!
Zarejestruj sięZaloguj się
Posiadasz już konto? Zaloguj się poniżej.
Zaloguj się