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

时间:2014-07-31 18:40:07

标签: c++ overloading

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

因此,以下是简化示例,仅供参考。 函数重载案例:

#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("%d\n", func(z));
  printf("%d\n", 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("%d\n", func(z));
     printf("%d\n", func(z,12));
}

给我以下错误:“本地变量a可能不会出现在此上下文中”

那么,在C ++中有没有办法模仿这种行为?我从来没有在其他语言中遇到过这个问题,比如Java甚至ASP。

谢谢大家。

3 个答案:

答案 0 :(得分:5)

在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("%d\n", func(z));
      printf("%d\n", func(z,12)); 
  }

答案 1 :(得分:4)

切换func()定义的顺序,以便在一个参数版本之前定义2参数版本。编译器在遇到定义之前不知道2参数版本是否存在,所以在你告诉编译器它存在之前你不能调用它。

答案 2 :(得分:3)

您必须更改定义的顺序:

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

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

LIVE DEMO

这种情况正在发生,因为在int func(pair a)中您正在调用int func(pair a, int b),这是不可见的。改变上述定义的顺序可以解决这个问题。