unrecognizable template declaration/definition

0

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

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

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!

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&);

1

Weźmy prostszy przykład

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.

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.

0

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

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