包裹式铸造

时间:2017-10-03 23:15:15

标签: c++ templates inheritance casting

有人可以帮我理解为什么这段代码会编译:

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的转换。

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

1 个答案:

答案 0 :(得分:2)

class B源自class A,因此每个B 一个A,可以在其位置使用。但是,wrapper<A>wrapper<B>没有关系 - 为什么会这样?

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

要完成此类关系,您需要从wrapper<B>派生wrapper<A>,而wrapper<>作为模板类是不可能的。考虑其他方法,您可以将B发送到wrapper<A>类或类似的方法(工作,因为 a A)。