2011-11-27 54 views
2

我確定它已被問了100次,但push_back是一個非常受歡迎的問題,因此在搜索很長時間後我找不到答案。遞歸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

你確定'Vector3f'的定義?所有成員函數都被聲明爲private。 – pmr

+0

您需要將「const」添加到聲明中,如下所示:Vector3f&operator =(const Vector3f&obj) – dasblinkenlight

+0

@pmr,我插入了缺失的行。 – zsero

回答

3

賦值運算符是從您的Vector3f類失蹤。向量的push_back的模板擴展需要一個賦值操作符來將值複製到向量中,所以編譯器會抱怨它找不到它。如果您要修改該標題,則還需要定義一個Vector3f(cont Vector3f& other)複製構造函數。

+0

和運算符=應該將其輸入爲const:'運算符=(const Vector3f&obj)' – Tim

+1

除非賦值運算符有一個很好的理由來取非const引用。這可能並非如此。 – pmr

0

解決方案

基於這些問題的答案和我的其他問題在這裏:

How to modify a given class to use const operators

改變三件事情所需要的解決方案:

  1. 創建拷貝構造函數
  2. 重載[] opera TOR與常量
  3. 變化=運算符爲const

在VS2010沒有這些東西是需要編譯成它的代碼。只有GCC才需要更改。