【问题标题】:c++ inherit from specialized template classc++ 从专门的模板类继承
【发布时间】:2012-10-09 06:17:26
【问题描述】:
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++ 开始抱怨:找不到该符号。有人知道为什么吗?

【问题讨论】:

  • As above, I have a template class A, and its partial specialized form A'. So is it possible for A to inherit from A'? 这听起来不像从自身继承一个类吗?
  • 试试说this-&gt;aa而不是aa吧?
  • @SingerOfTheFall - 不,它没有。它只是从更具体的形式派生出更通用的形式。前段时间与容器一起使用的技巧是在 void/void* 上派生形式/包含容器特化,它实现了所有机制并且仅以通用形式适当地转换。

标签: c++ templates inheritance template-specialization


【解决方案1】:

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

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

编辑:正如 Mehrdad 指出的那样 ->aa 也应该可以工作。

【讨论】:

    【解决方案2】:

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

    如果只看class A 的定义,符号aa 对类型参数T1、T2 或T3 没有明显的依赖性。所以编译器试图解析这个名字,但它不能,因为那个名字在那个环境中是未定义的。

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

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

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

    【讨论】:

      猜你喜欢
      • 2016-04-06
      • 2012-01-15
      • 2023-03-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-01-21
      • 2012-02-07
      • 1970-01-01
      相关资源
      最近更新 更多