Скрытие перегруженной виртуальной функции

Рассмотрим следующую иерархию структур:

struct I1 {
virtual void doit() = 0;
};

struct I2 {
virtual void doit(int) = 0;
};

struct I12 : I1, I2 {
using I1::doit;
using I2::doit;
};

struct Derived : I12 {
void doit(int) override {}
};

Компилируя это (используя clang, или же g++ с -Woverloaded-virtual) дает мне предупреждение:

'Derived::doit' hides overloaded virtual function [-Woverloaded-virtual]

Однако, если я изменю I12 к следующему, он хорошо компилируется под clang, в то время как g++ -Woverloaded-virtual по-прежнему дает предупреждение:

struct I12 : I1, I2 {
using I1::doit;
void doit(int) override = 0;
};

Где разница между using I2::doit а также void doit(int) override = 0? Наивно, я бы подумал, что первого достаточно, чтобы сообщить компилятору, что я знаю, что есть две версии doit,

9

Решение

Жалуется что doit спрятан в Derived, Исправление:

struct Derived : I12 {
using I12::doit; // Bring all doit declarations from I12 into this scope.
void doit(int) override {}
};
1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]