重複の可能性:
同じ名前で異なるシグネチャを持つ複数の継承された関数がオーバーロードされた関数として扱われないのはなぜですか?
これは、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はこのコードをコンパイルするため、コードが本当に有効なC++であるかどうかがわかりません。私は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でもコンパイルされません。