如何在C++中重载模板的朋友提取运算符(>>)?
How to overload the friend extraction operator (>>) for templates in C++?
我正在尝试用模板重载友元>>
运算符。我不想直接定义它。
在下面代码中定义的方法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;
}
相关文章:
- 为什么比较运算符如此快速
- C++映射:具有自定义类的运算符[]不起作用(总是返回0)
- 使用C++中的模板和运算符重载执行矩阵运算
- 为什么这个运算符<重载函数对 STL 算法不可见?
- 增量运算符与后缀混淆
- 一个关于在C++中重载布尔运算符的问题
- 运算符C++ "delete []"仅删除 2 个前值
- 模板类无法识别友元运算符
- 我可以使用条件运算符初始化C风格的字符串文字吗
- 关闭||运算符优化
- 通过继承类使用来自不同命名空间的运算符
- C++Cast运算符过载
- 如何使用AngelScript注册SFML Vector2运算符
- 重载元组索引运算符-C++
- 如何使用重载的相等(==)运算符向测试用例添加描述
- 为什么Mat类的两个对象可以在不重载运算符+的情况下添加
- 多个If语句与使用逻辑运算符计算条件的单个语句的比较
- 布尔比较运算符是如何在C++中工作的
- 重载运算符new[]的行为取决于析构函数
- 是否需要使用 - &gt;运算符在C 中调用成员函数时