我有一个多态问题。
void func(std::vector< BaseClass* > A){}
std::vector< SubClass* > B;
func(B); //Compile error C2664
我得到一个错误:
error C2664 'func' : cannot convert parameter from 'std::vector<_Ty>' to 'std::vector<_Ty>' with
[
_Ty=B *
]
and
[
_Ty=A *
]
我也试过一些奇怪的东西,比如让参数成为一个指向vector的指针,我就像这样传递向量的地址:
void func(std::vector< BaseClass* > *A){}
std::vector< SubClass* > B;
func(&B); //same error
答案 0 :(得分:10)
没有多态矢量这样的东西。一个
std::vector
,以及C ++中的所有其他容器类型,包括
C样式数组总是只包含一种类型。事实上
两个不同的容器具有相关的类型
没有以任何方式使容器的类型相关。
在您的情况下,您可能需要构建第二个向量:
func( std::vector< BaseClass* >( B.begin(), B.end() ) );
请注意,尝试使用std::vector<DerivedClass*>
作为
使用std::vector<BaseClass*>
说reinterpret_cast
是
未定义的行为,可能无法正常工作。不能保证
中的BaseClass
子对象的实际物理地址
DerivedClass
对象具有与之相同的物理地址
完整的对象。
答案 1 :(得分:6)
拯救模板:
template<typename T>
void func(std::vector<T> A)
{
...
}
答案 2 :(得分:5)
this
是-a that
的事实并不意味着this
的集合是 that
的收集。
考虑如果你想要的东西被允许会发生什么:
void func(std::vector<BaseClass*>& A)
{
A.push_back(new BaseClass);
}
std::vector<SubClass*> B;
func(B);
糟糕! B
现在包含不是指向SubClass
的指针,并且取消引用该程序的程序未定义。
您需要使用正确的类型制作副本,使用模板或重构,这样您就不需要传递集合。