没有运算符“<<”匹配对象和字符串文字之间的这些操作数错误
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;
}
};
代码:
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;
}
};