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

3
我正在尝试使用模板重载 friend 运算符 >>,但我不想在内联中定义它。之前我已经尝试使用下面代码中定义的方法 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:   required from here
testMain.cpp:46:8: error: no match for 'operator>>' (operand types are 'std::istream {aka std::basic_istream}' and 'const int')
     in >> d.data;
        ^

期望输出

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

参考资料

1个回答

6
问题与模板无关。
operator>> 修改右侧的数据,但是您将该参数声明为 const,因此运算符无法修改它。编译器错误甚至说明要修改的值(d.data)是常量:
testMain.cpp:46:8: error: no match for 'operator>>' (operand types are 'std::istream {aka std::basic_istream}' and '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;
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接