当需要将基类作为参数时,无法传递子类的向量

时间:2018-07-19 19:31:03

标签: c++ casting stdvector

我有一个类A及其子类B和一个采用std::vector<A>的方法。而且我无法通过传递std::vector<B>来使其工作。

尽管我可以将子类B强制转换为A,但我应该能够将B s的向量传递给采用A s的向量的方法。我该怎么做呢?

#include <iostream>
#include <vector>

class A {

    public:

        A() {}
};

class B: public A {

    public: 

        B(): A() {}
};

void method(std::vector<A> a) {}

int main() {
    std::vector<B> b;
    method(b);

    return 0;
}

编译时:

g++ ex-cast-tag.cpp -std=c++11

ex-cast-tag.cpp:22:5: error: no matching function for call to 'method'
    method(b);
    ^~~~~~
ex-cast-tag.cpp:18:6: note: candidate function not viable: no known conversion from 'vector<B>' to 'vector<A>'
  for 1st argument
void method(std::vector<A> a) {}
     ^
1 error generated.

谢谢!

2 个答案:

答案 0 :(得分:2)

一种解决方案是使用模板。例如

template<typename C>
std::enable_if_t<std::is_base_of<A,C>::value>
method(std::vector<C> const&a) 
{
    // assume that a[i] is an A (derived or actually the same)

}

在这里,我使用SFINAE来确保C实际上是A或从A派生的。但您也可以改用static_assert。在这种情况下,您会收到更好的错误消息,但是method()的重载行为是不同的(即,当考虑使用此模板时)。

答案 1 :(得分:1)

如果BA的子类,则不能得出std::vector<B>std::vector<A>的子类的结论。为了在此处正确使用继承,您需要更改函数以接受类型为std::vector<A*>的参数,然后向其传递一个std::vector<A*>,其指针都指向类型为B的实例。另外,您也可以将该函数设为模板函数。