2012-10-09 215 views
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 ++开始抱怨:找不到那个符号。任何人都知道为什么?C++从专门模板类

+1

'如上所述,我有一个模板类A和它的部分专用形式A'。那么A有可能从A'继承?'这听起来不像是继承自己的类吗? – SingerOfTheFall

+0

试着说'this-> aa'而不是'aa'吧? – Mehrdad

+0

@SingerOfTheFall - 不,它没有。它只是从更具体的一个派生出更通用的形式。前一段时间与容器一起使用的技巧是在void/void *上派生form/include容器专门化,它实现了所有的机制,并且只适用于通用形式。 – Tomek

回答

1

据我记忆,你必须把'a'派生类与'使用'拉。下面的(我不记得确切的语法所以请原谅我的任何编译问题)添加到您的通用模板:

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

编辑:由于迈赫达德注意到这个 - > AA也应该工作。

0

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

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

所以,说服编译器做你想要的东西,你必须使用以下招数:

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

  • 资格与超类的构件,即使用甲< T1,T2,空隙> :: AA。这使得依赖非常明显。您也可以使用使用指令,这样就不必每次都输入。