Skocz do zawartości

C++ Template I <<


Andrzej Orkan

Rekomendowane odpowiedzi

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

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

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 :D

w kazdym razie costakiego.

Odnośnik do komentarza
Udostępnij na innych stronach

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

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

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

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

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ę
×
×
  • Dodaj nową pozycję...