1

テンプレートを介して継承されたクラスから typedef された情報を抽出することについて質問があります。私の質問を説明するために、次の簡単な例を考えてみましょう。

#include <iostream>

class A1{
public:
    void print(){ printf("I am A1\n"); };
};
class A2{
public:
    void print(){ printf("I am A2\n"); };
};

class B1{
public:
    typedef A1 A;
};

class B2{
public:
    typedef A2 A;
};

template<class b>
class C{
    typedef class b::A AA;
    AA a;
public:
    void Cprint() {     a.print();  };
};

int main()
{
    C<B1> c1;
    c1.Cprint();

    C<B2> c2;
    c2.Cprint();
}

クラス C は、クラス (B1 または B2) をテンプレート パラメーターとして受け取ります。B1 と B2 の両方に、A と呼ばれるタイプ定義があります (それぞれクラス A1 と A2 です)。コンパイル時に、クラス C は、2 つの「A」クラスのどちらが「B」クラスによって使用されているかを把握できる必要があります。g++ でコンパイルすると、上記のコードは完全に機能します。ただし、Intel の icpc でコンパイルすると、次のエラーが発生します。

test.cpp(24): error: typedef "A" may not be used in an elaborated type specifier
    typedef class b::A AA;
                     ^
    detected during instantiation of class "C<b> [with b=B1]" at line 33

同様の効果を達成する別の方法はありますか?もちろん、私の実際のコードはもっと複雑で、クラスをこのように構成したい理由があります。g++ ではなく icpc でコンパイルしたい理由もあります。

前もって感謝します。カール

4

1 に答える 1

2

変更してみてください:

template<class b>
class C{
    typedef class b::A AA;
    AA a;
public:
    void Cprint() {     a.print();  };
};

に:

template<class b>
class C{
    typedef typename b::A AA;
    AA a;
public:
    void Cprint() {     a.print();  };
};

b::A依存型です(どの型が使用されているかに依存しbます)。

参考までに、元の投稿されたコードはVS2008およびVS2010でコンパイルできませんでした。

于 2012-04-23T20:39:33.913 に答える