unrecognizable template declaration/definition

unrecognizable template declaration/definition
P2
  • Rejestracja:ponad 8 lat
  • Ostatnio:około 7 lat
  • Postów:19
0

Witam,
Poniższy kod generuje mi error jak w temacie:

Kopiuj
#include <iostream>
template <typename T> class myVector
{
private:
	T* buffer;
	size_t size;
	size_t capacity;
public:
	myVector();
	myVector(size_t s);
	myVector(const myVector<T>& rhs);
	myVector<T>& operator=(const myVector<T>& rhs);
	T& operator[](size_t index);
	ostream & operator<<(ostream & stream, const myVector<T>& rhs);
	~myVector();
};

Problem pojawia się w przed ostatniej linijce kodu:

Kopiuj
ostream & operator<<(ostream & stream, const myVector<T>& rhs);

Przyznam szczerze, że nie rozumiem powyższego błędu, a za wyjaśnienie problemu będę bardzo wdzięczny!

edytowany 1x, ostatnio: kq
kq
Moderator C/C++
  • Rejestracja:prawie 12 lat
  • Ostatnio:minuta
  • Lokalizacja:Szczecin
1

Na przyszłość wypadałoby przytoczyć komunikat błędu kompilatora. Cały, a nie tylko wyrwany z kontekstu fragment.

Na pewno używasz ostream, mając na myśli std::ostream oraz definiujesz trójargumentowy operator<<, co nie ma sensu. Prawdopodobnie chciałeś zadeklarować static std::ostream& operator<<(std::ostream&, myVector<T> const&);


edytowany 1x, ostatnio: kq
twonek
  • Rejestracja:prawie 11 lat
  • Ostatnio:prawie 2 lata
  • Postów:2500
1

Weźmy prostszy przykład

Kopiuj
struct X 
{
    X operator+(const X& rhs);     // operator 2-argumentowy
};

X operator-(const X& lhs, const X& rhs);

Operator zadeklarowany wewnątrz klasy dostaje również dodatkowy argument - obiekt tej klasy. Czyli w Twoim przypadku powinieneś zadeklarowac operator<< poza klasą.

Trochę zamieszania wprowadza słowo kluczowe friend, a właściwie jego efekt uboczny, bo jeśli operator ma friend to oznacza że jest deklarowany poza klasą mimo że fizycznie znajduje się w klasie.

Kopiuj
struct X 
{
    friend X operator+(const X& lhs, const X& rhs);     // operator 2-argumentowy
};

Czyli mógłbyś dodać friend do swojego operatora i błąd zniknie, czego jednak nie polecam.

P2
Mógłbyś wyjaśnić dlaczego tego nie polecasz ?
twonek
Bo nie do tego służy friend, a nawet w swoim głównym obszarze zastosowań (czyli oferowaniu dostępu do prywatnych danych) friend często nie jest najlepszym wyborem.
Azarien
ja bym powiedział, że friend właśnie SŁUŻY do prawidłowego definiowania operator<< i do niewielu rzeczy więcej :-)
P2
  • Rejestracja:ponad 8 lat
  • Ostatnio:około 7 lat
  • Postów:19
0

Dzięki za szybką odpowiedź i wytłumaczenie!

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.