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 ++开始抱怨:找不到该符号。谁知道为什么?
答案 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 指令,这样就不必每次都输入。