递归push_back不适用于自定义类

时间:2011-11-27 00:37:34

标签: c++ class object gcc vector

我确定已经被问了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中解决此问题所需的完整步骤,我将其作为附加答案发布。

2 个答案:

答案 0 :(得分:3)

您的Vector3f类中缺少赋值运算符。向量的push_back的模板扩展需要赋值运算符将值复制到向量中,因此编译器会抱怨它无法找到它。如果您要修改该标头,则还需要定义Vector3f(cont Vector3f& other)复制构造函数。

答案 1 :(得分:0)

<强>解决方案

基于这些答案以及我在这里的另一个问题:

How to modify a given class to use const operators

改变3件事所需的解决方案:

  1. 创建复制构造函数
  2. 使用const
  3. 重载[]运算符
  4. 将=运算符更改为const
  5. 在VS2010中,这些代码都不需要按原样编译。只有在GCC中才需要进行更改。