使操作员过载两次 < > 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() { .... }
  ....
};