c++中没有匹配的函数调用,需要一双新鲜的眼睛
no matching function call in C++, need fresh pair of eyes
我正在构建一个有趣的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)
这样你就不需要使用ROWS
和COLS
,你可以正确地使用sizeof
我认为编译器错误信息说明了一切。该函数期望的是fstream
,但您传递的是ifstream
。ifstream
不是由fstream
衍生而来。