从模板参数派生的类

Posted

技术标签:

【中文标题】从模板参数派生的类【英文标题】:Derived class from template parameter 【发布时间】:2020-01-03 09:43:20 【问题描述】:

Derived类的多个定义是不允许的,所以下面是编译时错误。

class A1
    ;

class A2
    ;

class Derived: public A1
    ;
class Derived: public A2
    ;

同样,为什么以下不是编译时错误? Derived 类不会有 2 个版本,一个继承自 A1 而另一个继承自 A2

class A1
    ;

class A2
    ;

template<class T>
class Derived: public T
    ;

int main()

        Derived<A1> *ptr1 = new Derived<A1>;
        Derived<A2> *ptr2 = new Derived<A2>;    

【问题讨论】:

因为Derived&lt;T&gt;,不同的T,是不同的类 @anurag86:模板参数是类型的一部分(并且它们与二进制文件中的类名混合在一起) Derived 不是类,是类模板; Derived&lt;A1&gt; Derived&lt;A2&gt; 是类;但不同。 “班级名称保持不变” 不是。你有两个不同的类:Derived&lt;A1&gt;Derived&lt;A2&gt;Derived 本身不是一个类,它是一个类模板。 “它没有被破坏。” 但它是? typeid(...).name() 分别给了我7DerivedI2A1E7DerivedI2A2E 是的。只是在类中添加了几个函数并调用了它们。并运行 nm out|xargs c++filt|grep Derived 并显示没有 DerivedDerived&lt;A1&gt;Derived&lt;A2&gt; 。谢谢大家 【参考方案1】:

不会有两个Derived 类,继承自A1A2,但实际上是一个类Derived&lt;A1&gt;Derived&lt;A2&gt;。您传递给模板参数的数据成为类的一部分。删除 Derived&lt;A1&gt; 并将 A1 传递给模板参数 T实例化类模板。

我认为here 解释得更好:

模板实例化 涉及生成具体类或 模板的特定组合的函数(实例) 论据。

而且根本不会有Derived 类。正如max66在评论中指出的,Derived不是一个类,而是一个类模板,不会单独编译,没有实例化。

【讨论】:

以上是关于从模板参数派生的类的主要内容,如果未能解决你的问题,请参考以下文章

C++:当包含从类模板派生的类的标头时,编译器警告 C4505

包含指向派生模板类的基类指针的类的赋值运算符和复制构造函数

如何定义派生模板类的功能?

具有不同模板的派生类对象的向量

如何使用在同一类的基模板中的类中声明的枚举

派生类的模板类作为函数的参数 - 危险?