c++重载函数调用带有更多参数的自身版本

C++ overloaded function calling version of itself with more arguments

本文关键字:参数 版本 重载 函数调用 c++      更新时间:2023-10-16

我使用函数重载有一个行为的一般版本和一个更常见的一个。通常的函数只是为第二个参数选择一个默认值,它实际上取决于第一个参数,编译器会给我一个错误,因为它甚至不认识到第二个函数的存在。我也尝试过使用默认值,但是因为默认值依赖于第一个参数,编译器似乎不接受它。

所以,这里有一些简化的例子只是为了说明。函数重载情况:

#include <stdio.h>  
struct pair {
  int x;
  int y;
};
int func(pair a){
  return func(a, a.y);
}
int func(pair a, int b) {
  return a.x*b;
}
int main() {
  pair z;
  z.x = 2;
  z.y = 4;
  printf("%dn", func(z));
  printf("%dn", func(z,12));
}

这给了我错误:

a.c: In function ‘int func(pair)’:
a.c:9:21: error: too many arguments to function ‘int func(pair)’
a.c:8:5: note: declared here"

示例,默认值:

#include <stdio.h>
struct pair {
  int x;
  int y;
};

int func(pair a, int b = a.y) {
  return a.x*b;
}
int main() {
     pair z;
     z.x = 2;
     z.y = 4;
     printf("%dn", func(z));
     printf("%dn", func(z,12));
}

给出以下错误:"局部变量a可能不会出现在此上下文中"

那么,在c++中有任何方法来模拟这种行为吗?我在其他语言中从来没有遇到过这个问题,比如Java,甚至是ASP。

在C和c++中,在函数调用之前,应该声明或定义该函数。在这里,您正在调用return func(a, a.y);,但func(pair, int)函数尚未被声明或定义。

您需要更改这两个函数的定义,或者只是在代码的开头声明函数。正如其他答案解释了第一种方法一样,下面是第二种方法的代码片段。

  #include <stdio.h> 
  //Function Declaration
  int func(pair);
  int func(pair, int); 
  struct pair {
      int x;
      int y;
  };
  int func(pair a){
       return func(a, a.y);
  }
  int func(pair a, int b) {
      return a.x*b;
  }
  int main() {
      pair z;
      z.x = 2;
      z.y = 4;
      printf("%dn", func(z));
      printf("%dn", func(z,12)); 
  }

改变func()的定义顺序,使2参数版本在1参数版本之前定义。在遇到定义之前,编译器不知道有两个参数的版本存在,所以在你告诉编译器它存在之前,你不能调用它。

你必须改变定义的顺序:

int func(pair a, int b) {
  return a.x*b;
}
int func(pair a){
  return func(a, a.y);
}

现场演示

这是因为在int func(pair a)中,您调用的int func(pair a, int b)是不可见的。像上面那样改变定义的顺序可以解决这个问题。

相关文章: