重载运算符<<在模板类中

时间:2016-06-14 10:10:03

标签: c++ templates compilation

对不起,如果这个问题已经全部回答了,但考虑到在模板类中重载此运算符,我已经阅读了很多问题,但我还没有发现像我这样的特殊情况。

这是我的代码:

#include <iostream>

using std::cout; 
using std::endl;
using std::ostream;

template <typename T>
class Class
{
    T x;
    public:
    friend ostream& operator << (const Class<T>&, ostream& out);
};

template <typename T>
ostream& operator << (const Class<T>&, ostream& out)
{
    return (out << out.x << endl);
}

int main()
{
    Class<short> object;
    cout << object << endl;
}

我在最后一行收到此错误: 错误1错误C2679:二进制&#39;&lt;&lt;&#39; :找不到哪个操作符采用类型&#39;类&#39;的右手操作数。 (或者没有可接受的转换)g:\ ucenje \ objektno orijentirano programiranje \ template3 \ template3 \ main.cpp 25 1 template3

2 个答案:

答案 0 :(得分:4)

operator<<函数的参数已被切换,应该是例如

friend ostream& operator << (ostream& out, const Class<T>&1);

所有二元运算符的左侧始终是第一个参数,右侧是第二个参数。

答案 1 :(得分:4)

1. std::ostream应该是operator<<的第一个参数,所以

template <typename T>
ostream& operator << (const Class<T>&, ostream& out)

应该是

template <typename T>
ostream& operator << (ostream& out, const Class<T>& c)

2.您将operator<<定义为模板函数,但friend ostream& operator << (const Class<T>&, ostream& out);指向非模板函数,您应将其更改为

friend ostream& operator<< <T>(ostream& out, const Class<T>& c);

在声明类之前添加一些前向声明:

template <typename T>
class Class;
template <typename T>
ostream& operator << (ostream& out, const Class<T>& c);

LIVE1

或者您可以在类的定义中将operator<<定义为非模板函数。

template <typename T>
class Class
{
    T x;
    public:
    friend ostream& operator<< (ostream& out, const Class<T>& c)
    {
        out << c.x << endl;
        return out;
    }
};

LIVE2