C++ 中函数调用时编译器错误
Compiler error at function call in C++
我对C++相对较新,正在通过提问来学习。我正在尝试使用 getopt 来管理我的输入,并且我已经创建了函数来帮助使程序更清晰。这是我正在做的事情(片段):
void processArgs(int,char *,char **,long int *);
void processArgs(int argc, char ** argv, long int * res)
{
globalArgs.startTerm = NULL;
globalArgs.endTerm = NULL;
globalArgs.outFileName = NULL;
globalArgs.verbosity = 0;
int minimumArgs = 1;
//Check for minimum number of parameters
if (argc<minimumArgs){
displayUsage();
}
}
int main(int argc,char * argv[]){
int * results=NULL;
processArgs(argc,argv,results);
return 0;
}
当我运行以下编译时,我得到:
g++ -std=c++0x fibonacci.cpp -o fibonacci
fibonacci.cpp: In function âint main(int, char**)â:
fibonacci.cpp:68: error: no matching function for call to âprocessArgs(int&, char**&, int*&)â
fibonacci.h:3: note: candidates are: void processArgs(int, char*, char**, long int*)
fibonacci.cpp:46: note: void processArgs(int, char**, long int*)
有人可以帮助我了解问题吗?我敢肯定这与我对与 argv 相关的指针如何工作的理解减少有关。
谢谢Dan
您的函数签名不匹配
void processArgs(int,char *,char **,long int *);
void processArgs(int argc, char ** argv, long int * res)
检查char *
您可以从void processArgs(int,char *,char **,long int *);
中删除char *
,也可以删除整行。
这里因为您已经在上面定义了函数main()
所以不需要在函数之前使用void processArgs(int,char *,char **,long int *);
,因为编译器在编译之前已经获得了函数签名main()
。
考虑到这两个函数声明声明不同的函数,因为它们具有不同数量的参数
void processArgs(int,char *,char **,long int *);
void processArgs(int argc, char ** argv, long int * res);
但是,这不是错误的原因。
编译器的错误消息令人困惑。问题是在第二个函数声明(同时是一个定义)中,第三个参数被声明为具有类型
long int *
但是,您将函数作为参数传递给它的函数称为类型的对象(变量结果)
int *
这是传递给函数对象和函数调用的定义
int * results=NULL;
processArgs(argc,argv,results);
没有从int *
到long int *
的隐式转换
因此,编译器会发出错误。
首先,正如 rajenpandit 已经说过的,您的声明和定义签名是不同的。其次,我认为由于最后一个参数,它无法调用该函数:该函数期望long int *
,而您为其提供int *
。
代码中第一个明显的问题(对于程序员!)——rajenpandit 已经说过了——是签名不匹配——但是——正如来自莫斯科的 Vlad 所发现的那样——编译器并没有止步于此。调用本身与您给出的两个声明中的任何一个都不匹配。这是编译器所说的。
顺便说一句:在 C/C++ 中声明函数的最简单方法:使用剪贴板(手动添加分号):
void processArgs(int argc, char ** argv, long int * res);
void processArgs(int argc, char ** argv, long int * res)
{
// your function body
}
复制和粘贴方法还有另一个优点:函数声明还包含参数名称,这在有多个参数时特别有用。许多 IDE 还会在键入调用时将这些名称显示为提示。
- MSVC多行宏编译器错误
- 静态数据成员的问题-修复链接错误会导致编译器错误
- C++,我收到一个无法理解的编译器错误
- 我收到同义重复编译器错误。我应该如何修复"类型"X"的参数与类型"X"的参数不兼容?
- 重载方法的方式会在使用临时调用时生成编译器错误
- 尝试使用继承和模板实现CRTP.Visual Studio正在生成编译器错误
- 编译器错误:destuctor 的更宽松的抛出说明符
- Android NDK clang 编译器错误在 Windows 上显示'No such file or directory'
- C++ G++ 编译器 - 错误:隐式声明的定义
- 这个失败的测试是将零添加到空指针未定义的行为、编译器错误还是其他什么?
- 模板模板参数和模板别名:编译器错误?
- C++ 编译器错误:P1LinkedList.cpp:145:错误:重载的"to_string(int&)"调用不明确
- 在gcc中意外调用了Const重载.编译器错误或兼容性修复程序
- C1001内部编译器错误是由于矢量初始化(如数组)引起的
- 编译器错误(英特尔并行工作室 2019 与 Visual Studio 社区 2019)
- 如何在C++中克服此 C4430 编译器错误?
- 尝试使用 WinBGI 显示文本时出现编译器错误
- 使用typedef'ed返回类型声明友元函数时出现编译器错误
- 如何在类模板的成员函数中正确调用函数对象?正在生成 Visual Studio 编译器错误 C2440
- C++自定义分配器大小参数作为模板参数会引发编译器错误