0

我不明白这里有什么问题。我已经删除了我认为是代码中不相关的部分,以使其更易于阅读。调试器在“check(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);
    //...
}

错误:没有匹配函数调用'check(int [(int)tn][(int)tn], int&, Queen [(int)tn], int [(int)tn][2])'

4

3 回答 3

1

int grid[tn][tn];不是具有编译时固定大小的数组。C++ 中的可变长度数组是 GCC 扩展,而不是标准 C++。正如您所发现的,该扩展与 C++ 模板不兼容。

于 2013-05-10T22:29:30.263 回答
0

首先,正如 MSalters 指出的那样,可变大小的数组是不标准的扩展。但是,假设您的编译器支持它...


问题是二维数组衰减为双指针。而且编译器似乎不承认那些用于模板推导。因此,对于您通过的网格int**,您期望int *grid[N]它无法扣除向量的第一维。


但是对于这种情况,您可以通过提供所有尺寸来做到这一点。

template<size_t N>
void check(int grid[N][N], int& n, int *q, int coord[N][2])
{
于 2013-05-10T22:40:26.833 回答
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])
{
    //...
}
于 2013-05-10T22:37:10.293 回答