呼叫错误没有匹配功能

时间:2013-05-10 22:25:34

标签: c++ arrays function pointers call

我不明白这里有什么不对。我已经删除了我认为是代码中不相关的部分,以便于阅读。调试器在行"检查(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;

3 个答案:

答案 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])
{