使操作员过载两次 < > C++上可以重载相同的操作符两次?
当我尝试使用返回类型作为基重载+运算符时,编译器会显示一个错误使操作员过载两次 < > C++上可以重载相同的操作符两次?,c++,C++,当我尝试使用返回类型作为基重载+运算符时,编译器会显示一个错误 bigint.h:41:9: error: ‘std::string BigInt::operator+(BigInt)’ cannot be overloaded bigint.h:40:9: error: with ‘BigInt BigInt::operator+(BigInt)’ 这是我的代码: .h: .cc: Edit:显然,我不能使用返回类型作为基础来两次重载同一个操作符。建议: < P>方法C++中的超载是由参数列
bigint.h:41:9: error: ‘std::string BigInt::operator+(BigInt)’ cannot be overloaded
bigint.h:40:9: error: with ‘BigInt BigInt::operator+(BigInt)’
这是我的代码:
.h:
.cc:
Edit:显然,我不能使用返回类型作为基础来两次重载同一个操作符。建议: < P>方法C++中的超载是由参数列表,而不是返回值。因此,在您的情况下,这两个方法是不明确的,编译器无法判断使用哪一个(它们具有相同的参数列表)不,您不能基于返回类型重载 根据标准文件第13.1.2节
Function declarations that differ only in the return type cannot be overloaded.
这意味着,只有在参数不同时,方法才能重载。与C++一样,方法的返回类型不被认为是方法签名的一部分。
查看Wiki以了解更多详细信息正如已经指出的,您不能仅基于返回类型而重载。所以这很好:
Foo operator+(const Foo&, const Foo&);
Foo operator+(const char*, double);
但这不是:
Foo operator+(const Foo&, const Foo&);
Bar operator+(const Foo&, const Foo&);
但大多数情况下,对于给定的问题都有有效且简单的解决方案。例如,在像您这样的情况下,您希望以下各项发挥作用:
Foo a, b;
Foo c = a + b;
Bar bar = a + b;
然后,一种常见的策略是为Bar
提供一个隐式转换构造函数:
struct Bar
{
Bar(const Foo& foo) { .... }
};
或者给Foo
一个转换运算符:
struct Foo
{
explicit operator Bar() { .... }
....
};
注意:如果没有C++11编译器,则不能将运算符标记为显式。否这是不可能的。编译器无法知道您想要哪个版本,它会从参数中推断出来。您可以多次重载,但不能通过返回类型来重载。
struct Bar
{
Bar(const Foo& foo) { .... }
};
struct Foo
{
explicit operator Bar() { .... }
....
};