1
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++ 开始抱怨:找不到该符号。有人知道为什么吗?

4

2 回答 2

1

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

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

编辑:正如 Mehrdad 指出的那样,this->aa 也应该起作用。

于 2012-10-09T06:26:31.437 回答
0

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

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

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

  • 最简单的可能是this->aa。由于有一个依赖于模板参数的超类,它的成员只能在模板实例化时查找,所以一切都很好。

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

于 2013-07-14T06:40:14.907 回答