1

次のコード:C++の多重継承プライベートメンバambigiousアクセス

class A1 { 
public: 
    int x; 
}; 
class A2 { 
private: 
    int x() { return 67; } 
}; 

class M : public A1, public A2 {}; 

int main() { 
    M m; 
    m.x; 
} 

はエラーでコンパイル:

error C2385: ambiguous access of 'x' 
note: could be the 'x' in base 'A1' 
note: or could be the 'x' in base 'A2' 

しかし、なぜ? A1::xのみがMに見えるはずです。 A2::xは純粋にローカルである必要があります。

+1

C++では、*名前検索が* *が実行される*メンバーアクセス検査の前に起こります。 – WhiZTiM

+0

あなたの質問は以前に質問されました: http://stackoverflow.com/questions/6397938/ambiguous-access –

答えて

3

name-lookupは、member access checkingが実行される前に発生します。したがって、name-lookup(あなたのケースではUnqualified)は2つの名前を見つけます。それはあいまいです。

あなたは明確にするために修飾名を使用することができます

int main() { 
    M m; 
    m.A1::x;  //qualifed name-lookup 
} 
+0

@ tower120、no。これはADLとは関係ありません。 [Koenig Lookup](http://en.cppreference.com/w/cpp/language/adl)は、メンバー以外の機能の非限定的な参照を行うときに作用します – WhiZTiM

+0

ところで、これは歴史的なものか、これはデザイン(何かのために)?私にとっては、最初はコンパイラのバグのようでしたが、今は言語バグのようです:) – tower120

+1

いいえ、それは言語のバグではありません。予想されるアクセス制御が名前検索に影響を与えるのは問題です。アクセス制御が名前の検索に影響を与えた場合(例えば一致するものが変更された場合)、単純に 'private'を' public'に変更するか、または 'public'を単に変更するだけで、意図しない動作コードの動作を大幅に変更することは簡単です逆に。小さな変更があっても脆いコードを持つよりも、あいまいさ(あなたに起こったような)をプログラマに警告する方がよいでしょう。 – Peter