没有运算符“<<”匹配对象和字符串文字之间的这些操作数错误

No operator "<<" matches these operands error between an object and a string literal

代码:

catch (test& t)
{
    cout << t /*error here*/<</*to here*/ " is not a positive number";
}

导致错误:

No operator "<<" matches these operands

编译器 (c++ 20) 指出错误是 t" is not a positive number" 之间的 <<。可能是我重载运算符错误造成的?

这是我的运算符 << 重载:

ostream& operator << (ostream& os, const test& t)
{
    os << t.getX(); //getX is just a method for getting private member
    return os;
}

完整代码,如果这还不够:

class test
{
    int x;
public:
    explicit test(const int _x)
    {
        x = _x;
    }

    int getX() const
    {
        return x;
    }

    friend test& operator << (ostream&, test&);
};

ostream& operator << (ostream& os, const test& t)
{
    os << t.getX();
    return os;
}

auto main() -> int
{
    int n;
    cin >> n;
    try
    {
        if (n < 0)
        {
            throw test(n);
        }
    }
    catch (test& t)
    {
        cout << t /*error here*/ <</*to here*/ " is not a positive number";
    }
}

您已经声明了一个 operator<<,并定义了另一个。而错误的结果是最匹配的。

替换*您在 class 中声明的内容:

test & operator << (ostream & , test & )

有了这个,你已经定义了:

ostream & operator << (ostream & os, const test & t)

编辑:

*经常敏锐的 Mark Ransom 的敏锐观察:

根本不需要错误的声明。该函数不需要声明 friend。可以简单地删除该声明。

如果将运算符重载声明为 class/structure 成员,则需要 friend 修饰符。在全局声明的情况下,确实没有必要!

第一个选项:

class test {
  int x;

public:
  explicit test(const int _x) { x = _x; }
  int getX() const { return x; }
};

std::ostream& operator<<(std::ostream& os, const test &t) {
    os << t.getX();
    return os;
}

第二个选项:

class test {
  int x;

public:
  explicit test(const int _x) { x = _x; }
  int getX() const { return x; }
  friend std::ostream& operator<<(std::ostream& os, const test &t) {
    os << t.getX();
    return os;
  }
};