C++中模板参数的类继承

Posted

技术标签:

【中文标题】C++中模板参数的类继承【英文标题】:Class inheritance of template parameters in C++ 【发布时间】:2019-08-27 10:00:49 【问题描述】:

我是 C++ 新手,碰巧遇到如下代码:

template<class T, class Composite> class CompositeTester: public Composite

  public: 
    CompositeTester(T* instance, const typename Composite::Parameters& parameters) : Composite(parameters)
    
        singletonInstances_[parameters.instanceIndex] = instance;
    

    继承对我来说不是很清楚,因为继承来自模板类参数本身。这个概念叫什么?

    在构造函数CompositeTester 中,我意识到Composite 的实例是使用parameters 作为参数创建的。但是这种语法很难理解const typename Composite::Parameters。如何解释这种语法?即使在它存在之前定义一个复合类的对象是否有效?

    singletonInstances_[parameters.instanceIndex] = instance。这里是否为 parameters.instanceIndex 创建了一个新变量?除了我在此处的问题中提到的内容外,class Composite::Parametersclass Composite 的源代码中没有定义。

【问题讨论】:

【参考方案1】:

    这被称为curiously recurring template pattern。

    typename 在这里用于表示依赖类型名称。没有它,编译器会将限定名称解析为非类型实体。请参阅我们的常见问题解答:Where and why do I have to put the "template" and "typename" keywords?

    这在标准 C++ 中格式不正确,因为未声明 singletonInstances_。如果在基类中声明,则需要使用this-&gt;使其成为依赖名。

【讨论】:

我不太懂这个词:typename Composite::Parameters&amp; parameters。 :: 是范围解析运算符。那么parametersParameters 类型的Composite 对象并且正在传递引用吗? parameters 是对在(类)类型Composite 范围内声明的类型Parameters 的引用。 (引用不是对象,我不确定您所说的“Parameters 的对象”是什么意思)

以上是关于C++中模板参数的类继承的主要内容,如果未能解决你的问题,请参考以下文章

如何为从C++中的模板继承的类重载赋值运算符

C++:类模板遇到继承

消除多重继承中的类成员歧义

C++模板类的继承

C++ 中的类接口继承

从可变参数模板中扩展的 decltype 继承