【问题标题】:Wrapped Type Casting包裹式铸造
【发布时间】:2017-10-03 23:15:14
【问题描述】:

谁能帮我理解为什么这段代码会编译:

class A {};

class B : public A {};

void foo( A ) {}


int main() {
  B b;

  foo( b );
}

但这不是:

class A {};

class B : public A {};

template< typename T >
class wrapper {};

void foo( wrapper<A> ) {}

int main() {
  wrapper<B> b;

  foo( b );
}

第二个代码(即不编译的代码)的唯一区别是AB 类被包装为wrapper 类中的模板参数;令人惊讶的是,包装似乎阻碍了从BA 的转换。

如果有人可以帮助我修复第二个代码,那也很棒。

【问题讨论】:

标签: c++ templates inheritance casting


【解决方案1】:

class B 派生自class A,因此每个B 一个A 并且可以在其位置使用。但是,wrapper&lt;A&gt;wrapper&lt;B&gt; 没有关系 - 为什么会这样?

考虑这个例子:如果 B 是 A 的儿子,那么 B 的妻子会是 A 的妻子的儿子吗(显然不是 - 他们没有关系)。

要完成这样的关系,您需要从wrapper&lt;A&gt; 派生wrapper&lt;B&gt;,而wrapper&lt;&gt; 是模板类,这是不可能的。考虑其他方法,将B 发送到wrapper&lt;A&gt; 类或类似类的方法中(有效,因为它 A)。

【讨论】:

  • 我想我们都应该庆幸 A 不是 B 的儿子。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-11-01
  • 2012-01-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多