2014-01-15 161 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)); 
相关问题