如何从通过模板继承的类中提取typedef信息?

时间:2012-04-23 20:29:18

标签: c++ templates typedef icc

我有一个关于从通过模板继承的类中提取typedef'd信息的问题。为了说明我的问题,请考虑以下简单示例:

#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的tyepdef(分别是A1和A2类)。在编译时,C类应该能够确定“B”类正在使用两个“A”类中的哪一个。当我用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

还有另一种方法可以达到类似的效果吗?当然,我的实际代码要复杂得多,并且我希望以这种方式构建类。还有我想用icpc而不是g ++编译的原因。

提前致谢。 卡尔

1 个答案:

答案 0 :(得分: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::Adependent type(取决于b使用的类型)。

仅供参考,原始发布的代码无法使用VS2008和VS2010进行编译。