簡體   English   中英

沒有匹配功能可解決通話錯誤

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM