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

Overloading operator << in a template class

本文关键字:运算符 重载      更新时间:2023-10-16

抱歉,如果这个问题已经准备好了,但我读了很多问题,考虑到在模板类中重载这个运算符,但我还没有找到像我这样的特殊情况。

这是我的代码:

#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:二进制"<<":未找到采用类型为"Class"的右操作数的运算符(或者没有可接受的转换) g:\ucenje\objektno orijentirano programiranje\template3\template3\main.cpp 25 1 模板3

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

直播1

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

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

直播2

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

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

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