c++中没有匹配的函数调用,需要一双新鲜的眼睛

no matching function call in C++, need fresh pair of eyes

本文关键字:眼睛 新鲜 一双 c++ 函数调用      更新时间:2023-10-16

我正在构建一个有趣的c++项目,我有以下错误:没有匹配的函数调用'loopAction'我花了大约1.5小时试图弄清楚这一点,并通过Stack overflow阅读可能是什么问题。我希望有人能帮我找到问题所在。

我的程序中有以下原型:

//Global Constants
const int ROWS = 100;
const int COLS = 100;
void loopAction(fstream &, int [][COLS], int, int, int);

在上面的例子中,fstream是一个文件对象,int[][]是一个二维数组,最后三个值是变量。

我已经声明的变量:

    ifstream File;
    File.open("deskInfo.txt");
    int n, m;
    char theValues[ROWS][COLS];

下面是对函数的调用:

loopAction(File, theValues, ROWS, n, m);

和实际功能:

void loopAction(fstream &file, int values[][COLS], int rows, int n, int m){
    char row;
    for (int r = 0; r < n; r++){
        for (int c = 0; c < m; c++){
            file >> row;
            values[r][c] = row;
        }
}

}

如果需要更多的信息,请告诉我。完整的错误信息是:

语义问题,没有匹配的函数调用' loopAction ' =>候选函数不可用:没有已知的第一个参数从' ifstream '(又名' basic_ifstream<char> ')到' fstream & '(又名' basic_fstream<char> & ')的转换

theValues类型为char[][],但方法签名接受int[][]

与你最初的问题无关的其他一些提示:

  • 使用模板化方法来防止数组衰减,这将有助于在这种情况下(见下文)
  • 优先选择const而不是#define
  • 在命名和大小写约定上保持一致:与其他pascalcase标识符相比,您使用的标题大小写File似乎是任意的。
  • 在方法声明中加入参数名

数组衰减(foo[N]如何变为foo*)可以通过接受数组类型(带大小)作为模板参数来防止:

template<typename TArray,int length>
void loopAction(fstream& file, TArray& values[length], size_t n, size_t m)

这样你就不需要使用ROWSCOLS,你可以正确地使用sizeof

我认为编译器错误信息说明了一切。该函数期望的是fstream,但您传递的是ifstreamifstream不是由fstream衍生而来。