フォローアップの質問this one。コンパイラは、テンプレート引数リスト内で基本クラスのコンストラクタを選択するのはなぜですか?
基本的には、次のコードでは、なぜコンパイラはC
のコンストラクタでA<B>
内部B
がB
基底クラスの(アクセス不可)コンストラクタを参照していることを考えるのですか?
struct B{};
template <typename T>
struct A : private T{};
struct C : public A<B>{
C(A<B>); // ERROR HERE
};
Live example on Ideone.出力:あなたはA<B*>
、A<B&>
あるいはA<const B>
に、コンストラクタ引数を変更した場合、同じエラーがポップアップすること
prog.cpp:1:9: error: 'struct B B::B' is inaccessible
prog.cpp:7:7: error: within this context
注意。また、MSVC10、GCC 4.7、およびClang 3.1 ToTのうちの3つがエラーになるので、C++仕様の何かでなければならないことにも注意してください。 なんですか?
全く同じトピックを作成した理由はわかりません。あなたはそれをより良いものにするためにそのトピックを編集できました。 – Nawaz
@Nawaz:基本的には別の質問です。私は「なぜ」と尋ねる。他方の質問は「何をするか」と尋ねる。 – Xeo
男、私はこれを 'class A:private NotCopyable {class B:private NotCopyable {}} 'で2回以上噛まれました。グローバルスコープを見る前に、クラススコープでシンボルを検索すると思います。 –