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