2016-04-27 55 views
-3

我想創建一個使用來自類A的對象的二維向量,但我得到以下錯誤。使用對象創建二維向量C++

error: no matching function for call 'std::vector<A>::push_back(A*)' 

我使用下面的代碼來創建我的向量。我已經使用類似的代碼來創建布爾的2-d向量,只需在下面的代碼中將'A'更改爲'bool'即可。我不知道爲什麼這不起作用。

不工作密碼

std::vector<std::vector<A> > board; 
for(int i=0;i<rows;i++) 
{ 
    board.push_back(vector<A>()); //insert rows 
} 

for(int i=0;i<rows;i++) 
{ 
    for(int j=0;j<cols;j++) 
    { 
     board[i].push_back(new A(i,j)); //insert cols and value 
    } 
} 

工作代碼

vector<vector<bool> > board; 
for(int i=0;i<rows;i++) 
{ 
    board.push_back(vector<bool>()); 
} 

for(int i=0;i<rows;i++) 
{ 
    for(int j=0;j<cols;j++) 
    { 
     board[i].push_back(false); 
    } 
} 
+3

你爲什麼使用'new'來創建該類的對象?您正試圖將指針推入對象的向量中。 – user463035818

+0

你是認真的!該死..我的大腦剛剛凍結。謝謝 –

回答

3
board[i].push_back(new A(i,j)); // new A(..) returns A * 

應該成爲

board[i].push_back(A(i,j)); // A(..) return A 
+0

每次我聲明一個沒有對象名稱的對象時我使用了指針。所以對此沒有任何線索。謝謝 –

+0

@SafwanUllKarim A(i,j)是對類A的構造函數的調用。它將創建並返回類型A的對象:'A a = A(i,j);'同樣是'A a(i, j);' – LibertyPaul

+0

@SafwanUllKarim:_「每當我聲明一個沒有對象名稱的對象時我使用了指針」_然後你的代碼可能有一個內存泄漏_ton_! –

2

你寫:

board[i].push_back(new A(i,j)); 

new A(i,j)A*(指向A的指針)的值。您應該推入A類型的值。那是你應該寫什麼:

board[i].push_back(A(i,j)); 
+1

'board [i] .emplace_back(i,j);'會更好。 –

2

你得到該錯誤消息說,你所需要的一切知道

error: no matching function for call 'std::vector::push_back(A*)'

編譯器不能找到一個函數調用中插入一個指向A對象到std::vector

隨着行:

board[i].push_back(new A(i,j)); 

您試圖指針推到std::vector。 要麼你改變你的數據結構來

std::vector<std::vector<A*>> board; 

(牢記免費內存之後,也改變初始化)

,或者你改變你的方法調用

board[i].push_back(A(i,j)); 
+2

'board [i] .emplace_back(i,j);'會更好。 –