Пре- и постфиксный инкременты в разных классах

Рейтинг: 0Ответов: 1Опубликовано: 19.02.2015

Хочу реализовать примеси с реализацией определенных операторов, чтобы избежать дублирования кода. Но поместить операторы пре- и постфиксного инкремента в разные классы почему-то не получается. Пример:

class A
{
    public: 
    A(){}
    A& operator++(){return *this;}
};

class B
{
    public:
    B(){}
    B operator++(int){return *this;}        
};

class C:public A, public B
{
    public:
    C(){}
};

int main()
{
    C c;
    c++;
}

Вывод:

ошибка: запрос элемента «operator++» неоднозначен
  c++;
   ^
замечание: претенденты: B& B::operator++(int)
  B& operator++(int){return *this;}
     ^
замечание:              A& A::operator++()
  A& operator++(){return *this;}

Почему так происходит, и как можно это исправить?

Любопытно, что если убрать постфиксный оператор, то будет ошибка, что оператор не объявлен. Если поместить операторы в один класс, то ошибки нет.

Обновление

В моём случае подходит даже наследование B от A, но в этом случае, по мнению компилятора, не объявлен уже префиксный оператор.

Ответы

▲ 1Принят

Код не работает, так как GCC сначала ищет лишь имя метода, и находит его в двух базовых классах. Поэтому и ошибка. Списки аргументов на этой стадии не рассматриваются. Интересно, что Clang компилирует этот код из-за ошибки в компиляторе.

Решение: использовать using и создать отдельный класс, производный от классов перегружающих эти два оператора. Далее наследовать уже от него.

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