前后增量运算符在不同的类中

时间:2015-02-20 05:53:35

标签: c++ operator-overloading

我想创建重载运算符的特性,以避免代码重复。但是当我尝试将前置和后置增量运算符放在不同的类中时,编译器会给出一个错误:"运算符++是不明确的"代码:

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,但编译器无法找到后增量运算符。为什么会发生这种情况,以及正确的方法是什么?

1 个答案:

答案 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;
}