Возможный дубликат:
Почему многонаследованные функции с одинаковым именем, но разные подписи не могут рассматриваться как перегруженные функции?
Это не скомпилируется в указанном месте с помощью g++ 4.6.1:
enum Ea { Ea0 };
enum Eb { Eb0 };
struct Sa { void operator()(Ea) {} };
struct Sb { void operator()(Eb) {} };
struct Sbroken : Sa, Sb {};
struct Sworks {
void operator()(Ea) {}
void operator()(Eb) {}
};
int main() {
Sworks()(Ea0);
Sbroken()(Ea0); // g++ can't disambiguate Ea vs. Eb
}
Clang 2.8 компилирует этот код, что делает меня неопределенным, если код действительно действителен С++ или нет. Я собирался сделать оптимистично, что clang был прав, а g++ был неправильным, но затем я сделал небольшое изменение, которое сделало clang аналогичной ошибкой:
enum Ea { Ea0 };
enum Eb { Eb0 };
struct Sa { void f(Ea) {} };
struct Sb { void f(Eb) {} };
struct Sbroken : Sa, Sb {};
struct Sworks {
void f(Ea) {}
void f(Eb) {}
};
int main() {
Sworks().f(Ea0);
Sbroken().f(Ea0); // both clang and g++ say this is ambiguous
}
Единственное изменение, которое я сделал, заключалось в использовании именованной функции f
, а не operator()
. Я не понимаю, почему это имеет значение, но это так: эта версия не компилируется с g++ или с clang.