我确信这个问题已经被问了 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
。我自然会认为下面的代码可以工作,但事实并非如此。它在第 1 级有效,但在第 2 级无效。
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 中解决此问题所需的完整步骤,我将其作为附加答案发布。
最佳答案
您的 Vector3f 类中缺少赋值运算符。 vector 的push_back的模板扩展需要一个赋值运算符将值复制到 vector 中,因此编译器提示它找不到它。如果要修改该 header ,您还需要定义一个 Vector3f(cont Vector3f& other)
复制构造函数。
关于c++ - 递归push_back不适用于自定义类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8282763/