首页 > 解决方案 > 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' 类型的右手操作数(或者没有可接受的转换)?

标签: c++ooptemplates

解决方案


operator<<需要将第二个参数作为 const 引用:

friend ostream& operator<<(ostream& stream, const Interval<T>& C)

没有 const,临时对象(由 返回operator&&)不能绑定到引用以传递给函数。


推荐阅读