我将类型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;
}
答案 0 :(得分:2)
movement mo((i,j), (m,n));
在此声明中,(i,j)
和(m,n)
是逗号运算符的用法。他们将分别评估j
和n
的值。所以你的声明与:
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}}