c ++继承自专门的模板类

时间:2012-10-09 06:17:27

标签: c++ templates inheritance template-specialization

template<typename T1, typename T2, typename T3>
class A: public A<T1, T2, void> {
public:
    T1 a;
    T2 b;
    T3 c;

    void set() { a = aa; } // Cannot find variable `aa' here!
};

template<typename T1, typename T2>
class A<T1, T2, void> {
public:
    T1 aa;
    T2 bb;
};

如上所述,我有一个模板类A,以及它的部分专用形式A'。那么A有可能从A'继承吗?根据g ++,似乎没问题。但是,当我试图访问A'中的成员时,g ++开始抱怨:找不到该符号。谁知道为什么?

2 个答案:

答案 0 :(得分:1)

据我所知,你必须使用'using'将aa拉入派生类。在您的通用模板中添加以下内容(我不记得确切的语法,请原谅我任何编译问题):

using A<T1, T2, void>::aa;

编辑:正如Mehrdad所指出的那样 - > aa也应该有用。

答案 1 :(得分:0)

使用C ++模板查找规则的名称可能看起来有点不直观。当编译器首先解析模板定义时,它会解析所有名称,这些名称不是依赖于模板参数。当涉及到模板实例化时,它将解决剩下的问题。

如果仅查看 A类的定义,则 aa 符号在类型参数T1,T2或T3上没有明显的依赖关系。因此,编译器尝试解析名称,但它不能,因为该名称在该环境中未定义。

因此,为了说服编译器做你想做的事,你必须使用下面的技巧:

  • 最简单的可能是 this-&gt; aa 。由于具有依赖于模板参数的超类,因此只能在模板实例化时查找其成员,因此一切正常。

  • 使用超类限定成员,即使用 A&lt; T1,T2,void&gt; :: aa 。这使得依赖性非常明显。您也可以使用 using 指令,这样就不必每次都输入。