【问题标题】:Abstract template class and inheritance contructor抽象模板类和继承构造函数
【发布时间】:2015-08-06 02:43:46
【问题描述】:

我的构造函数有问题,我想做这样的事情:

A<int>* first = new B<int>
A<int> *second;

second= new B<int>(*A);

我尝试在参数列表指针、引用和值中使用,但没有任何效果,我不知道为什么。这是我不工作的构造函数:

template <class T>
B<T>::B(B<T> other) 

它适用于const A&lt;T&gt;&amp; 谢谢, 如果可以的话,还有一件事。我必须在此构造函数中访问 B 类私有类字段。如果我只有其他是 A 类。我可以在其他时候这样做吗?

【问题讨论】:

  • A&lt;T&gt;B&lt;T&gt; 有什么关系?
  • 该代码无法编译。
  • A类是B的基类,是公共继承
  • 顺便说一句:new B&lt;int&gt; 缺少;B&lt;T&gt; other 应该是const B&lt;T&gt;&amp; other
  • 仍然:错误 C2664:'B::B(B &)':无法将参数 1 从 'A' 转换为 'B &'

标签: c++ templates


【解决方案1】:

假设B&lt;T&gt; 继承A&lt;T&gt;,正如您在评论中描述的那样,您在编写new B&lt;int&gt;( some_value_of_type_A ); 时尝试downcast

您必须提供一个采用A&lt;T&gt; 类型的构造函数,如下所示:

template<class T>
B<T>::B(const A<T>& other);

【讨论】:

  • 是的,second= new B&lt;int&gt;(*A); 没有任何意义,因为 A 是一个类型而不是一个对象......
  • 它开始工作了,谢谢。如果可以的话,还有一件事。我必须在此构造函数中访问 B 类私有类字段。如果我只有其他是 A 类。我可以在其他时候这样做吗?
  • @Hangoverflow 你不知道A&lt;T&gt; other 在运行时是否真的拥有一个有效的B&lt;T&gt;。要确定是否存在,您可以使用 RTTI,谷歌一下。
  • 我知道,因为我在测试中知道这是 B 类,就像我在这个问题的第一个代码中给你写的一样。我必须得到 B 类在类字段中持有的任何东西:值。
  • @Hangoverflow 如果您想假设otherB&lt;T&gt;,您可以强制转换。使用const B&amp; b = static_cast&lt;const B&amp;&gt;(other);dynamic_cast 而不是static_cast。您应该阅读两者之间的区别。
猜你喜欢
  • 1970-01-01
  • 2018-11-29
  • 2014-08-12
  • 2019-12-14
  • 2016-03-04
  • 1970-01-01
  • 2020-02-10
  • 1970-01-01
  • 2020-06-19
相关资源
最近更新 更多