4

サブクラスが同じテンプレートを共有することは可能ですか?例えば:

template <class T>
class A
{
private:
  T _aObj;
public:
  class B
  {
  public:
    T _bObj;
  };
};

ATはとの両方で使用できますBか?

これを試してみると、次のエラーが発生します。

エラー:A::Bはテンプレートではありません

4

3 に答える 3

6

はい、正常に動作します(標準に準拠したコンパイラで)。

これが論理的である理由の考え方は、Bが単なる一部ではなく、の一部であるためAですA<T>Tは、の型の一部であるだけでなくAB(の正しい名前はA<T>::B。)の一部でもあります。

于 2012-08-21T21:10:07.430 に答える
1

標準の最新の公開ドラフトから、ネストされたクラスのスコープとアクセスルールは次のとおりです。

9.7ネストされたクラス宣言[class.nest]

1クラスは別のクラス内で宣言できます。別のクラス内で宣言されたクラスは、ネストされたクラスと呼ばれます。ネストされたクラスの名前は、それを囲むクラスに対してローカルです。ネストされたクラスは、それを囲むクラスのスコープ内にあります。

11.7ネストされたクラス[class.access.nest]

1ネストされたクラスはメンバーであるため、他のメンバーと同じアクセス権があります。囲んでいるクラスのメンバーは、ネストされたクラスのメンバーに特別にアクセスすることはできません。通常のアクセス規則(第11条)に従うものとします。

于 2012-08-21T21:16:21.167 に答える
1

一部のC++コンパイラでは許可されていませんが、確かにそうです(Freescale HCS12コンパイラが思い浮かびます)。しかし、GCCまたはMSVCのどのフレーバーでも、これを問題なくコンパイルできます。

于 2012-08-21T21:10:25.293 に答える