[英]No matching function for call error
我不明白這里出了什么問題。 我削減了我認為與代碼無關的部分,以使其更易於閱讀。 調試器在下面的“ 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])”
int grid[tn][tn];
不是具有編譯時固定大小的數組。 C ++中的可變長度數組是GCC擴展,不是標准C ++。 正如您所發現的那樣,該擴展名與C ++模板不兼容。
除了可變長度數組不是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])
{
//...
}
首先,可變大小數組是MSalters指出的非標准擴展。 但是,假設您的編譯器支持它...
問題是二維數組會衰減為雙指針。 而且編譯器似乎無法識別那些用於模板推導的代碼。 因此,在此處為grid傳遞int**
並且期望int *grid[N]
無法扣除向量的第一維。
但是,對於這種情況,您可以通過提供所有尺寸來做到這一點。
template<size_t N>
void check(int grid[N][N], int& n, int *q, int coord[N][2])
{
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.