C ++函数调用时的编译器错误

时间:2014-02-28 10:31:08

标签: c++ compiler-errors declaration signature

我对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相关的指针如何工作的理解减少有关。

由于 丹

4 个答案:

答案 0 :(得分:3)

您的功能签名不匹配

void processArgs(int,char *,char **,long int *);

void processArgs(int argc, char ** argv, long int * res)

检查char *

您可以从char *删除void processArgs(int,char *,char **,long int *);,也可以删除整行。

这里因为你已经定义了main()以上的函数所以不需要在函数之前使用void processArgs(int,char *,char **,long int *);,因为编译器在编译main()之前已经获得了函数签名。

答案 1 :(得分:2)

考虑到这两个函数声明声明了不同的函数,因为它们具有不同数量的参数

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 *

的隐式转换

因此编译器会发出错误。

答案 2 :(得分:1)

首先,正如 rajenpandit 已经说过,您的声明和定义签名是不同的。 其次,我认为由于最后一个参数而无法调用该函数:函数需要long int *,而你提供int *

答案 3 :(得分:1)

代码中的第一个显而易见的问题(对于程序员!) - rajenpandit已经说明了 - signature不匹配 - 但是 - Vlad from Moscow找到了{{3}} - 编译器并没有就此止步。 调用本身与您提供的两个声明中的任何一个都不匹配。这就是编译器所说的。


顺便说一句: 在C / C ++中声明函数的最简单方法:使用剪贴板(手动添加分号):

void processArgs(int argc, char ** argv, long int * res);

void processArgs(int argc, char ** argv, long int * res)
{
    // your function body
}

复制和粘贴方法还有另一个优点:函数声明还包含参数名称,如果有多个参数,这将特别有用。当您键入呼叫时,许多IDE还会将这些名称显示为提示。