Ваш вектор является шаблоном класса. Следовательно, компилятор не знает Vector
. Он знает только Vector<...someType...>
.
Так что вы можете написать что-то вроде этого
std::ostream& operator << (std::ostream & o, const Vector<int> & v){
return o;
}
С этой функцией минимальный рабочий пример, который не изменяет заголовок, будет:
template <typename T>
class Vector
{
private:
int sz;
T* buf;
public:
// member functions all the way down
friend std::ostream& operator<<(std::ostream& o, const Vector& v);
};
std::ostream& operator<<(std::ostream& o, const Vector<int>& v)
{
return o;
}
int main()
{
Vector<int> a;
std::cout << a << std::endl;
}
Однако, чтобы получить общего оператора вне потока, вы должны использовать другой шаблон:
template <typename T>
std::ostream& operator<<(std::ostream& o, const Vector<T>& v)
{
return o;
}
В этом случае реализация должна оставаться в заголовке. В противном случае вы можете использовать его только в своем Vector.cpp
, потому что шаблоны не производят никакого кода, пока они не будут созданы. В результате каждый файл, который хочет использовать оператор, должен знать реализацию шаблона для генерации необходимого кода.
Кроме того, для правильной работы необходимо настроить объявление друга:
template <typename T2>
friend std::ostream& operator<<(std::ostream& o, const Vector<T2>& v);
Чтобы найти более разумный способ настроить объявление друга, взгляните на ответ Р. Саху