我确定已经被问了100次,但是push_back
是一个非常受欢迎的问题,在搜索了很长时间之后我找不到答案。
我的问题是,在this page上,它表示递归push_back
应该在多个级别上完美运行而没有任何问题。
vector< vector<int> > vI2Matrix; // Declare two dimensional array
vector<int> A, B;
A.push_back(10);
A.push_back(20);
A.push_back(30);
B.push_back(100);
B.push_back(200);
B.push_back(300);
vI2Matrix.push_back(A);
vI2Matrix.push_back(B);
但是在我的版本中,我尝试使用自定义类Vector3f
而不是int
。我自然会认为以下代码可行,但事实并非如此。它适用于第一级,但不适用于第二级。
vector< vector<Vector3f> > m;
vector<Vector3f> a;
a.push_back(Vector3f(1,2,3)); // <- 1st level works
m.push_back(a); // <- 2nd level doesn't
返回的错误代码是:
gobase.h:343: error: no match for ‘operator=’ in ‘* __result = * __first’
demo1.h:38: note: candidates are: Vector3f& Vector3f::operator=(Vector3f&)
Vector3f
类是在外部头文件中定义的,我不应该修改它。您是否认为给定的头文件中缺少什么使我无法使用push_back
?
头文件中定义了以下函数:
class Vector3f {
float _item[3];
public:
float & operator [] (int i)
Vector3f(float x, float y, float z)
Vector3f()
Vector3f & operator = (Vector3f & obj)
Vector3f & operator += (Vector3f & obj)
bool operator ==(Vector3f & obj)
}
更新
以下是标题文件中的& operator =
:
Vector3f & operator = (Vector3f & obj)
{
_item[0] = obj[0];
_item[1] = obj[1];
_item[2] = obj[2];
return *this;
};
你能告诉我应该如何修改它以使push_back
有效吗?
看看在GCC中解决此问题所需的完整步骤,我将其作为附加答案发布。
答案 0 :(得分:3)
您的Vector3f类中缺少赋值运算符。向量的push_back的模板扩展需要赋值运算符将值复制到向量中,因此编译器会抱怨它无法找到它。如果您要修改该标头,则还需要定义Vector3f(cont Vector3f& other)
复制构造函数。
答案 1 :(得分:0)
<强>解决方案强>
基于这些答案以及我在这里的另一个问题:
How to modify a given class to use const operators
改变3件事所需的解决方案:
在VS2010中,这些代码都不需要按原样编译。只有在GCC中才需要进行更改。