サブクラスが同じテンプレートを共有することは可能ですか?例えば:
template <class T>
class A
{
private:
T _aObj;
public:
class B
{
public:
T _bObj;
};
};
A
Tはとの両方で使用できますB
か?
これを試してみると、次のエラーが発生します。
エラー:A::Bはテンプレートではありません
サブクラスが同じテンプレートを共有することは可能ですか?例えば:
template <class T>
class A
{
private:
T _aObj;
public:
class B
{
public:
T _bObj;
};
};
A
Tはとの両方で使用できますB
か?
これを試してみると、次のエラーが発生します。
エラー:A::Bはテンプレートではありません
はい、正常に動作します(標準に準拠したコンパイラで)。
これが論理的である理由の考え方は、B
が単なる一部ではなく、の一部であるためA
ですA<T>
。T
は、の型の一部であるだけでなくA
、B
(の正しい名前はA<T>::B
。)の一部でもあります。
標準の最新の公開ドラフトから、ネストされたクラスのスコープとアクセスルールは次のとおりです。
9.7ネストされたクラス宣言[class.nest]
1クラスは別のクラス内で宣言できます。別のクラス内で宣言されたクラスは、ネストされたクラスと呼ばれます。ネストされたクラスの名前は、それを囲むクラスに対してローカルです。ネストされたクラスは、それを囲むクラスのスコープ内にあります。
11.7ネストされたクラス[class.access.nest]
1ネストされたクラスはメンバーであるため、他のメンバーと同じアクセス権があります。囲んでいるクラスのメンバーは、ネストされたクラスのメンバーに特別にアクセスすることはできません。通常のアクセス規則(第11条)に従うものとします。
一部のC++コンパイラでは許可されていませんが、確かにそうです(Freescale HCS12コンパイラが思い浮かびます)。しかし、GCCまたはMSVCのどのフレーバーでも、これを問題なくコンパイルできます。