有人可以帮我理解为什么这段代码会编译:
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 );
}
第二个代码(即,不编译的代码)的唯一区别是类A
和B
被包装为类wrapper
中的模板参数;令人惊讶的是,包装似乎阻碍了从B
到A
的转换。
如果有人可以帮我修复第二个代码,也会很棒。
答案 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
)。