c++ - C2679 二进制“<<”:未找到采用右侧操作数类型的运算符
问题描述
间隔的模板类,基本上包含组的边缘,在本例中为 INT。请求运算符的源代码是
void testIntervalInt() {
Interval<int> interval = Interval<int>(2, 1);
cout << interval << endl;
Interval<int> interval13(1, 3);
Interval<int> interval24(2, 4);
Interval<int> interval45(4, 5);
cout << interval13 << endl;
cout << interval24 << endl;
cout << interval45 << endl;
cout << "Does " << interval13 << " contain " << 2 << "? " << interval13.contains(2) << endl;
cout << "Does " << interval24 << " contain " << 2 << "? " << interval24.contains(2) << endl;
cout << "Does " << interval45 << " contain " << 2 << "? " << interval45.contains(2) << endl;
cout << "Is " << interval13 << " before " << interval24 << "? "
<< interval13.isBefore(interval24) << endl;
cout << "Is " << interval13 << " before " << interval45 << "? "
<< interval13.isBefore(interval45) << endl;
cout << "Is " << interval24 << " before " << interval45 << "? "
<< interval24.isBefore(interval45) << endl;
cout << "Is " << interval13 << " after " << interval24 << "? "
<< interval13.isAfter(interval24) << endl;
cout << "Is " << interval13 << " after " << interval45 << "? "
<< interval13.isAfter(interval45) << endl;
cout << "Is " << interval24 << " after " << interval45 << "? "
<< interval24.isAfter(interval45) << endl;
cout << "Does " << interval13 << " intersect " << interval24 << "? "
<< interval13.intersects(interval24) << endl;
cout << "Does " << interval13 << " intersect " << interval45 << "? "
<< interval13.intersects(interval45) << endl;
cout << "Does " << interval24 << " intersect " << interval45 << "? "
<< interval24.intersects(interval45) << endl;
cout << "Does " << interval24 << " intersect " << interval13 << "? "
<< interval24.intersects(interval13) << endl;
cout << "Does " << interval45 << " intersect " << interval13 << "? "
<< interval45.intersects(interval13) << endl;
cout << "Does " << interval45 << " intersect " << interval24 << "? "
<< interval45.intersects(interval24) << endl;
cout << "interval13 && interval24 = " << (interval13 && interval24) << endl;
cout << "interval13 && interval45 = " << (interval13 && interval45) << endl;
cout << "interval24 && interval45 = " << (interval24 && interval45) << endl;
cout << "interval24 && interval13 = " << (interval24 && interval13) << endl;
cout << "interval45 && interval13 = " << (interval45 && interval13) << endl;
cout << "interval45 && interval24 = " << (interval45 && interval24) << endl;
cout << "interval13 || interval24 = " << (interval13 || interval24) << endl;
cout << "interval24 || interval13 = " << (interval24 || interval13) << endl;
cout << "interval13 || interval45 = " << (interval13 || interval45) << endl;
cout << "interval24 || interval45 = " << (interval24 || interval45) << endl;
cout << "interval45 || interval13 = " << (interval45 || interval13) << endl;
cout << "interval45 || interval24 = " << (interval45 || interval24) << endl;
然而,问题并不在于整个事情。直到带有 && 或 || 的所有间隔 打印到控制台没有问题。这里是超载
friend ostream& operator<<(ostream& stream, Interval<T>& C) {
bool error_flag;
error_flag = C.isValid();
if (error_flag == true) {
stream << C.getProblem();
}
else {
stream << "(" << C.getleft() << ", " << C.getright() << ")";
}
return stream;
}
Isvalid 返回一个错误标志,problem 返回一个字符串。
我认为问题源于 && 和 || 的重载,但是无论我尝试什么,它都不会工作并保持相同的错误:
template<typename T>
Interval<T> Interval<T>::operator&&(const Interval<T>& other) {
bool intersection_flag;
intersection_flag = this->intersects(other);
if (intersection_flag == false) {
return Interval<int>(0, 0);
}
else {
if (this->Left_edge > other.getright()) {
return Interval<T>(other.getright(), this->Left_Edge);
}
else {
return Interval<T>(other.getleft(), this->Right_Edge);
}
}
}
template<typename T>
Interval<T> Interval<T>::operator||(const Interval<T>& other) {
bool intersection_flag;
Interval<T> interval;
intersection_flag = this->intersects(other);
if (intersection_flag == false && this->Right_Edge != other.Left_Edge && this->Left_Edge != other.Right_Edge) {
interval = Interval<int>(1, 0);
return interval;
}
else {
if (this->Left_Edge >= other.Right_Edge) {
interval = Interval<T>(other.Left_Edge, this->Right_Edge);
return interval;
}
else {
interval = Interval<T>(this->Left_Edge, other.Right_Edge);
return interval;
}
}
}
有没有人知道为什么我不断收到错误 C2679 二进制 '<<': no operator found 它采用'Interval' 类型的右手操作数(或者没有可接受的转换)?
解决方案
您operator<<
需要将第二个参数作为 const 引用:
friend ostream& operator<<(ostream& stream, const Interval<T>& C)
没有 const,临时对象(由 返回operator&&
)不能绑定到引用以传递给函数。
推荐阅读
- javascript - 如何使用 nodejs 读取 worldedit .schem 文件
- database - 无法在 Synapse Studio 中删除无服务器数据库
- visual-c++ - 基于 WebView2 的 ActiveX 控件和拦截 WM_LBUTTONDBLCLK
- python - 如何重新排列输入的拆分
- swift - 显示相同项目的动态列表,即使填充的列表都是唯一项目
- java - 接受许可时出错 - Android Studio
- javascript - 为什么带有等待的异步请求不等待响应数据?
- node.js - 如何在上传后立即接收 Cloudinary 图像 URL(React JS 和 Node Js)?
- reactjs - React、Jest 和测试库:TypeError:使用 findBy(例如 findByAltText)时无法读取 null 的属性“createEvent”
- javascript - Ngrx Effect 中的 MergeMap 导致类型错误