我试图像这样重载OSTREAM运算符:
#include <iostream>
using namespace std;
template <typename T>
class MyClass
{
public:
MyClass(){};
friend ostream& operator << (ostream&,const MyClass<T>&);
};
template<typename T>
ostream& operator << (ostream& out , const MyClass<T>& source)
{
out << "it works";
return out;
}
int main ()
{
MyClass<int> test;
cout << test;
return 0;
};
我收到警告和错误
警告:
warning: friend declaration ‘std::ostream& operator<<(std::ostream&,const MyClass<T>&)’ declares a non-template function [-Wnon-template-friend]
friend ostream& operator << (ostream&,const MyClass<T>&);
错误:
undefined reference to `operator<<(std::ostream&, MyClass<int> const&)'
我没有得到它,如果我使用模板函数为什么编译器找不到我的模板函数?
为什么当我实现这样的事情时:
#include <iostream>
using namespace std;
template <typename T>
class MyClass
{
public:
MyClass(){};
friend ostream& operator << (ostream& out,const MyClass<T>& source)
{
out << "it works" << endl;
return out;
}
};
int main ()
{
MyClass<int> test;
cout << test;
return 0;
};
编译器找到我的模板函数没有问题,
那么如果我不想在类中实现它,我应该怎么做? (就像第二个代码一样,并且像第一个代码一样实现)