2014-01-15 159 views
1

我聲明類型movement作爲一對int s,但Piece.cpp初始化返回以下錯誤。爲什麼?聲明對中的「錯誤:沒有匹配函數調用...」

Piece.cpp:54:41: error: no matching function for call to ‘std::pair<std::pair<int, int>, 
    std::pair<int, int> >::pair(int&, int&)’ 

Globals.hpp

#ifndef GLOBALS_HPP_ 
#define GLOBALS_HPP_ 
typedef std::pair< std::pair<int, int>, std::pair<int, int> > movement; 
#endif /* GLOBALS_HPP_ */ 

Piece.cpp

#include "Globals.hpp" 
#include "Piece.hpp" 
using namespace std; 

vector<movement> generatePossibleMovements() { 
    vector<movement> pm; 
    int i, j, m, n; 
    movement m((i,j), (m,n)); 
    pm.push_back(m); 
    return pm; 
} 
+0

你需要包括''和''。 – juanchopanza

回答

2
movement mo((i,j), (m,n)); 

在此聲明,(i,j)(m,n)是逗號運算符的使用。他們將分別評估值爲jn。所以,你的聲明是一樣的:

movement mo(j, n); 

這種嘗試構建僅使用兩個int小號std::pairstd::pair秒。明確構建內對

的方法之一是要做到:

movement mo(std::make_pair(i,j), std::make_pair(m,n)); 

也許是更好的語法更接近你想要的是:

movement mo({i, j}, {m, n}); 

這將初始化參數的構造函數分別爲{i, j}{m, n}。如果你喜歡你的initialisations是一致的,你可以這樣做:

movement mo{{i, j}, {m, n}}; 
// or 
movement mo = {{i, j}, {m, n}}; 
1

它看起來像你需要#include <utility>

您還有一個錯字;你想創建兩個當地人命名爲m

int i, j, m, n; 
//  ^
movement m((i,j), (m,n)); 
//  ^

最後,這裏真正的問題是你如何試圖構造pair。你假設,即使你還沒有真正說要構造一對內pair旨意建造:

movement x((i,j), (m,n)); 

這可能是最好只使用make_pair代替:

movement x(make_pair (i,j), make_pair (m,n)); 
相關問題