我不明白这里有什么不对。我已经删除了我认为是代码中不相关的部分,以便于阅读。调试器在行"检查(grid,n,q,coord);"下面显示以下错误。任何帮助表示赞赏:)
#include <iostream>
#include "Queen.h"
using namespace std;
template<size_t N>
void check(int *grid[N], int& n, Queen *q, int *coord[N])
{
//...
}
int main()
{
// Init
int n;
cout << "Grid size:" << endl;
cin >> n;
int const tn=n;
Queen q[tn];
int grid[tn][tn];
int coord[tn][2];
cin.get();
for (int i=0; i < n; i++) {
for (int j=0; j < n; j++)
grid[i][j]=0;
coord[i][0]=0;
coord[i][1]=0;
}
//...
check(grid, n, q, coord);
//...
}
错误: 没有匹配函数来调用&#39; check(int [(int)tn] [(int)tn],int&amp;,Queen [(int)tn],int [(int)tn] [2])&# 39;
答案 0 :(得分:1)
int grid[tn][tn];
不是具有编译时固定大小的数组。 C ++中的可变长度数组是GCC扩展,而不是标准C ++。正如您所发现的那样,该扩展与C ++模板不兼容。
答案 1 :(得分:0)
除了可变长度数组不是C ++标准,你的模板是错误的
template<size_t N>
void check(int *grid[N], int& n, Queen *q, int *coord[N])
{
//...
}
应该是
template<typename T, size_t N>
void check(T (&grid) [N], int& n, Queen *q, T (&coord) [N])
{
//...
}
答案 2 :(得分:0)
首先,可变大小的数组是MSalters指出的非标准扩展。但假设你的编译器支持它......
问题是二维数组衰减为双指针。并且编译器似乎不认识那些用于模板推理的人。因此,对于网格,您传递了int**
,并且您希望int *grid[N]
无法扣除向量的第一维。
但是对于这种情况,你可以通过提供所有尺寸来实现这一点。
template<size_t N>
void check(int grid[N][N], int& n, int *q, int coord[N][2])
{