クラスD
はコンパイルされますが、クラスC
はどうしてですか?C++のプライベートテンプレートクラスからコンストラクタを継承する
class A
{
public:
A(int) {}
};
template <class T>
class B : private T // Note: private base class
{
public:
using T::T;
};
class C : public B<A>
{
public:
C() : B<A>(123) {} // Error: 'class A A::A' is inaccessible
}; // within this context
using BA = B<A>;
class D : public BA
{
public:
D() : BA(123) {} // OK
};
私はGCC、ClangおよびVisual C++でテストし、それらはすべて同じです。 class B : private T
からpublic T
に変更すると問題が解決します。しかし、なぜ? (using T::T
がpublic
であることに留意されたい。)
「テンプレート」タグを追加してホットショットをアタッチしました。 "tag spamming"の批判を私に教えてください。 – Bathsheba
'B (123)'を 'B(123)'に置き換えるとコンパイルされ、 'C'をテンプレート化してどこでも 'B'を使うとコンパイルされます。 –
Holt
それはテンプレートタグを正当化し、実際にクラステンプレートの名前検索は微妙に異なります。 – MSalters