从模板参数派生的类
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<T>
,不同的T
,是不同的类
@anurag86:模板参数是类型的一部分(并且它们与二进制文件中的类名混合在一起)
Derived
不是类,是类模板; Derived<A1>
和 Derived<A2>
是类;但不同。
“班级名称保持不变” 不是。你有两个不同的类:Derived<A1>
和 Derived<A2>
。 Derived
本身不是一个类,它是一个类模板。 “它没有被破坏。” 但它是? typeid(...).name()
分别给了我7DerivedI2A1E
和7DerivedI2A2E
。
是的。只是在类中添加了几个函数并调用了它们。并运行 nm out|xargs c++filt|grep Derived
并显示没有 Derived
但 Derived<A1>
和 Derived<A2>
。谢谢大家
【参考方案1】:
不会有两个Derived
类,继承自A1
和A2
,但实际上是一个类Derived<A1>
和Derived<A2>
。您传递给模板参数的数据成为类的一部分。删除 Derived<A1>
并将 A1
传递给模板参数 T
您实例化类模板。
我认为here 解释得更好:
模板实例化 涉及生成具体类或 模板的特定组合的函数(实例) 论据。
而且根本不会有Derived
类。正如max66在评论中指出的,Derived
不是一个类,而是一个类模板,不会单独编译,没有实例化。
【讨论】:
以上是关于从模板参数派生的类的主要内容,如果未能解决你的问题,请参考以下文章