声明对中的“错误:没有匹配的呼叫功能...”

时间:2014-01-15 17:32:26

标签: c++

我将类型movement声明为一对int,但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;
}

2 个答案:

答案 0 :(得分:2)

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

在此声明中,(i,j)(m,n)是逗号运算符的用法。他们将分别评估jn的值。所以你的声明与:

相同
movement mo(j, n);

尝试仅使用两个std::pair来构建std::pair int个。

明确构造内部对的一种方法是:

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

或许更接近你所尝试的更好的语法是:

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

这将分别使用{i, j}{m, n}初始化构造函数的参数。如果您希望初始化保持一致,则可以执行以下操作:

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

答案 1 :(得分: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));

{{1}}