4

クラスのメンバーの型を参照するために他の場所で使用できる型名をテンプレート化されたクラスで定義したいと考えています。

template <class T>
class CA
{
public:
    //typedef typename T::iterator iterator_type;
    typedef typename T ElementType1; // compile error on this line
    //typedef T ElementType2;

    T m_element;
};

次のように使用します。

template <class T>
class CDerived : public CBase<typename T::ElementType1>
{
 //...
};

次のようなオブジェクトを宣言します。

typedef CDerived<CA> MyNewClass;

これは不可能ですか?次の行を使用する Xcode ではなく、VS2010 では正しくコンパイルされるコードがいくつかあります。

typedef typename T ElementType1;

どうやらコンパイラは typename の後に修飾名を期待しているようですが、テンプレート型に修飾名を付ける方法がわかりません。

このコンテキストでは、ElementType1 と ElementType2 の違いがわかりません。

スタック オーバーフローに関する多くの質問を見ましたが、ほとんどの場合、私の例では iterator_type のような種類の宣言のみを参照しているようです。

4

2 に答える 2

4

コンパイラTは型 ( ) であることを既に認識しているため、最初のケースでは修飾子class Tは必要ありません。typenameOTOH、コンパイラはそれT::ElementType1が型であることを事前に知りません。それは、Tが最終的に何になるかによって異なります。

于 2011-12-12T09:55:35.360 に答える
4

typename修飾名を修飾するためにのみ使用できます。直後の名前には適用されませんが、修飾名に適用されます。つまり、次のようになります。

typedef typename T::X x;

は にtypename適用され、には適用されXませんT。このため、(この用途では) 修飾名の前でのみ有効です。修飾されていない名前は、名前が型であるかどうかをコンパイラが認識できるコンテキストにある必要があります。(実際には、これは依存する基本クラスで定義された型の問題であり、これらは修飾できます。)

于 2011-12-12T09:59:30.710 に答える