在使用模板时,重载ostream运算符的正确方法是什么?

时间:2015-08-30 02:27:09

标签: c++ templates operator-overloading

我试图像这样重载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;
};

编译器找到我的模板函数没有问题,

那么如果我不想在类中实现它,我应该怎么做? (就像第二个代码一样,并且像第一个代码一样实现)

0 个答案:

没有答案