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

Posted

技术标签:

【中文标题】如何从通过模板继承的类中提取 typedef 的信息?【英文标题】:How can you extract typedef'd information from a class that is inherited through templates? 【发布时间】:2012-04-23 20:29:17 【问题描述】:

我有一个关于从通过模板继承的类中提取 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 的 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++ 编译。

提前致谢。 卡尔

【问题讨论】:

恕我直言,最好在模板类型的参数列表中使用 typename 关键字,并从大写字母开始编写类名。 【参考方案1】:

尝试改变:

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 是dependent type(取决于b 使用的类型)。

仅供参考,原贴的代码无法用VS2008和VS2010编译。

【讨论】:

是的!这样可行。非常感谢!所以我想重点是 b 类可能有一个结构或一个名为 A 的成员(不是类)? 是的,b::A 可以是 static int

以上是关于如何从通过模板继承的类中提取 typedef 的信息?的主要内容,如果未能解决你的问题,请参考以下文章

如何创建一个从打字稿中的类中提取所有方法的类型?

Java继承篇总结

在继承的类中启动线程

如何从包含的类中执行函数

从继承的类中覆盖虚拟方法但保留基类的注释[重复]

如何从基类中的函数调用重载函数?