我想创建重载运算符的特性,以避免代码重复。但是当我尝试将前置和后置增量运算符放在不同的类中时,编译器会给出一个错误:"运算符++是不明确的"代码:
class A
{
public:
A& operator++(){return *this;}
};
class B
{
public:
B operator++(int){return *this;}
};
class C:public A, public B
{
};
int main()
{
C c;
c++;
++c;
}
在我的情况下,可以从A继承B,但编译器无法找到后增量运算符。为什么会发生这种情况,以及正确的方法是什么?
答案 0 :(得分:0)
GCC拒绝代码,因为它首先执行名称查找而不考虑参数列表,并且名称在两个基类中找到。 Clang接受代码,但这是由bug引起的。
解决方案是添加using
并创建一个继承自A和B的单独类,然后从该类继承C.
class A
{
public:
A& operator++(){return *this;}
};
class B
{
public:
B operator++(int){return *this;}
};
class AAndB:public A, public B
{
public:
using A::operator++;
using B::operator++;
};
class C:public AAndB
{
};
int main()
{
C c;
c++;
++c;
}