template <class T>
class A{
//...
};
class B{
//...
};
class C{
protected:
vector< A<B> > vec;
public:
void f(B *ptr);
};
C::f(B *ptr){
vec.push_back(ptr); // gives error
}
我正在尝试将元素添加到向量中会产生编译错误。我该如何解决这个问题?
答案 0 :(得分:6)
您无法将B*
类型的元素推送到设计为采用A<B>
元素的向量中。你想要达到什么目标?
如果你只是想让它编译,那么(假设B
是可复制的):
将您的矢量声明为vector<B>
。
使用push_back(*B)
。请注意,它不是pushback
。
答案 1 :(得分:3)
它期待一个A,你给它一个B
A<B> a;
a.initsomehowwith(*ptr);
vec.push_back(a);
答案 2 :(得分:1)
整理你的设计。你到底想要做什么?你有一个A<B>
的向量,但是你试图将指针推向B.你是否希望进行某种转换?你的代码从根本上说没有意义。
答案 3 :(得分:1)
我认为你可能想要的是这样的:
void C::f(B &ptr){ // reference not a pointer
A<B> b_in_a(B) ;
vec.push_back(b_in_a); // gives error
}
如果你在任何容器模板中使用指针以外的东西,请确保你是复制,赋值和比较运算符是完全实现的。另请注意,除非使用指针,否则无法在容器中存储子类。
答案 4 :(得分:0)
根据reference,方法的名称是push_back,它引用的不是指针。
答案 5 :(得分:0)
两个错误:
push_back
采用下划线。B*
转换为A<B>
答案 6 :(得分:0)
vec
不接受B*
类型的值,您将其定义为A<B>
。您可以将vec
重新定义为:
vector< B* > vec;
答案 7 :(得分:0)
首先,您的向量存储A<B>
类型而不是B*
的项目。
其次是push_back
没有后退。