引用派生类指针的std :: vector作为函数的输入参数

时间:2010-10-13 09:36:02

标签: c++

首先,如果有另外一个像我这样的问题而且我没有找到它,我还是要道歉。我一直在努力,但由于问题非常具体,我找不到。

现在,问题。我有一个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>        ]

事先谢谢。

6 个答案:

答案 0 :(得分:4)

您的问题是即使DNode来自BNodestd::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 *的向量。原始指针是具有相同二进制表示的原始类型,与指向的类型无关。因此,两种指针类型的向量都是运行时兼容的。