如何在C++中重载模板的朋友提取运算符(>>)?

How to overload the friend extraction operator (>>) for templates in C++?

本文关键字:gt 运算符 提取 朋友 C++ 重载      更新时间:2023-10-16

我正在尝试用模板重载友元>>运算符。我不想直接定义它。

在下面代码中定义的方法add()的帮助下,我也尝试过这样做。它运行良好。我希望我的>>操作员也这样做。

以下是我的代码:

#include<iostream>
template<class T>class Demo;
template<class T>
std::ostream& operator<<(std::ostream&, const Demo<T> &);
template<class T>
std::istream& operator>>(std::istream&, const Demo<T> &);
template<class T>
class Demo {
private:
    T data; // To store the value.
public:
    Demo(); // Default Constructor.
    void add(T element); // To add a new element to the object.
    Demo<T> operator+(const Demo<T> foo);
    friend std::ostream& operator<< <T>(std::ostream &out, const Demo<T> &d);
    friend std::istream& operator>> <T>(std::istream &in, const Demo<T> &d);
};
template<class T>
Demo<T>::Demo() {
    data = 0;
}   
template<class T>
void Demo<T>::add(T element) {
    data = element;
}
template<class T>
Demo<T> Demo<T>::operator+(const Demo<T> foo) {
    Demo<T> returnObject;
    returnObject.data = this->data + foo.data;
    return returnObject;
}
template<class T>
std::ostream& operator<<(std::ostream &out, const Demo<T> &d) {
    out << d.data << std::endl;
    return out;
}
template<class T>
std::istream& operator>>(std::istream &in, const Demo<T> &d) {
    in >> d.data;
    return in;
}
int main() {
    Demo<int> objOne;
    std::cin>>objOne;
    Demo<int>objTwo;
    objTwo.add(3);
    Demo<int>objThree = objOne + objTwo;
    std::cout << "Result = " << objThree;
    return 0;
}

实际问题

当试图重载好友提取运算符(>>)时,编译器显示如下错误:

testMain.cpp:52:15:从这里开始是必需的testMain.cpp:46:8:错误:"operator>>"不匹配(操作数类型为"std::istream{aka std::basic_stream}"answers"const int")在>>数据中;^

预期输出

结果=59运行成功(总时间:49ms)

参考

  • "重载C++中的提取运算符>>[重复]"定义了如何重载>>运算符。但它没有提到它与模板的用法。

  • "重载模板类的友元运算符<<"定义了如何重载<<运算符,而不是>>运算符。

  • "重载提取运算符"也没有涵盖模板概念。

问题与模板无关。

operator>>修改右侧的数据,但您将该参数声明为const,因此操作员无法修改它。编译器错误甚至指出要修改的值(d.data)为const:

testMain.cpp:46:8:错误:"operator>>"不匹配(操作数类型为"std::istream{aka std::basic_stream}"和"const-int"

您需要从第二个参数中删除const

template<class T>
std::istream& operator>>(std::istream&, Demo<T> &);
...
template<class T>
class Demo {
   ...
public:
    ...
    friend std::istream& operator>> <T>(std::istream &in, Demo<T> &d);
};
...
template<class T>
std::istream& operator>>(std::istream &in, Demo<T> &d) {
    in >> d.data;
    return in;
}