首先,如果有另外一个像我这样的问题而且我没有找到它,我还是要道歉。我一直在努力,但由于问题非常具体,我找不到。
现在,问题。我有一个Base类和一个Derived类(比如BNode和DNode),我有一个BNode *的std :: vector。我还有一个函数接收对这些指针的向量的引用。我在尝试将指向派生对象的std :: vector作为参数传递给此函数时遇到了麻烦:
class BNode
{
};
class DNode : public BNode
{
};
class Other
{
function(std::vector<BNode*>& inputVector) { }
}
当尝试将指针向量传递给派生类时,我从VS收到的错误是:
1> error C2664: 'Other::function' : cannot convert parameter 1 'std::vector<T>' to 'std::vector<T> &'
1> with
1> [
1> T=DNode *
1> ]
1> and
1> [
1> T=BNode *
1> ]
事先谢谢。
答案 0 :(得分:4)
您的问题是即使DNode
来自BNode
,std::vector<DNode*>
也不是来自std::vector<BNode*>
。
因此,编译器不知道如何从一种类型转换为另一种类型。
但你可以这样做:
std::vector<BNode*> bnode_list;
std::vector<DNode*> dnode_list(bnode_list.begin(), bnode_list.end());
答案 1 :(得分:3)
这是因为矢量&lt; Bnode *&gt;和矢量&lt; Dnode *&gt;没有任何亲子关系。它们是不同的对象。
我猜你已经创建了一个像std :: vector&lt; DNode *&gt; dnodevec; 相反,你可以创建std :: vector&lt; BNode *&gt; dnodevec;作为基类指针的向量,您可以安全地在向量中插入任何DNode类型指针。
答案 2 :(得分:1)
我怀疑你可能正在调用Other::function
这样的东西:
std::vector<DNode *> v;
// put stuff into v
Other o;
o.function(v);
不会编译,因为std::vector<DNode *>
是与std::vector<BNode *>
不同的类型。
可能合适的是:
std::vector<BNode *> v;
// You can put DNode * items into v
Other o;
o.function(v);
答案 3 :(得分:1)
不幸的是,你想要的东西在C ++中是不可能的,因为vector<BNode*>
和vector<DNode*>
被认为是不相关的类型(即使BNode
和{{1}之间存在明确的关系}})。
请考虑以下代码:
DNode
答案 4 :(得分:0)
C ++在模板中不支持covariance。即使std::vector<DNode*>
来自std::vector<BNode*>
,也无法将DNode
分配给BNode
。
为了让您的代码工作,您应该只声明指向BNode的指针向量,并根据需要使用指向DNode的指针填充它们。
答案 5 :(得分:0)
std::vector
不是covariant。
通常,您不应将DNode *
的向量作为BNode *
的向量传递。如果function
添加或替换指向与BNode
不同的DNode
的子类的指针,则会在DNode
向量中获得非DNode *
指针。
您最好按照其他答案中的说明更改类型。
但与其他答案所说的相反,如果DNode *
仅读取向量,则 可以传递function
的向量。要对其进行标记,请更改其签名以接受const
引用。然后,您可以按如下方式传递DNode *
向量:
function(reinterpret_cast<const std::vector<BNode *> &>(vec));
reinterpret_cast
通常很危险,你应该避免它,除非你知道非常好你在做什么。在这里,您正在绕过C ++类型系统将DNode *
的向量视为BNode *
的向量。原始指针是具有相同二进制表示的原始类型,与指向的类型无关。因此,两种指针类型的向量都是运行时兼容的。