c++重载函数调用带有更多参数的自身版本
C++ overloaded function calling version of itself with more arguments
我使用函数重载有一个行为的一般版本和一个更常见的一个。通常的函数只是为第二个参数选择一个默认值,它实际上取决于第一个参数,编译器会给我一个错误,因为它甚至不认识到第二个函数的存在。我也尝试过使用默认值,但是因为默认值依赖于第一个参数,编译器似乎不接受它。
所以,这里有一些简化的例子只是为了说明。函数重载情况:
#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)
是不可见的。像上面那样改变定义的顺序可以解决这个问题。
相关文章:
- 表达式 SFINAE:如何根据类型是否包含具有一个或多个参数的函数来选择模板版本
- 作为模板类型参数,为什么 type[N] 与其专用版本不匹配----模板<类 T>类 S<T[]>
- C++14 及更高版本是否允许 Lambda 函数的默认参数?如果是这样,怎么办?
- 如何创建一个版本的 boost::range::transform,该版本具有用于捕获上下文的额外参数
- 根据运行时参数调用模板函数的不同版本
- 无法使用 std::function 作为参数类型(需要函数指针版本)宁愿像 STL 这样的模板,但随后它无法推断参数
- CUDA9.2及以上版本中模板默认参数存在无法解决的外部函数错误
- 由于允许哪个版本的C++默认参数
- c++ 编译器优化是否可以针对布尔参数生成两个版本的函数
- C++17 模板推导指南未用于空参数集(版本 2)?
- 当模板参数为std::vector时,如何创建此方法的模板版本
- 为什么参数匹配适用于非模板版本,但不适用于模板版本
- const参数的类的只读版本
- 简短版本:错误 14 错误 C2660:'Player::addSpell':函数不接受 1 个参数
- 以不同方式实现可变参数构造函数的模板类:每个版本的优点和缺点是什么
- 同一方法签名的模板化和显式参数类型版本
- 从指针到具有常量和非常量版本的成员函数的模板参数推导
- 模板版本参数
- 创建我的.exe的批处理版本,它接受命令行参数(ParamCount(), ParamStr()和BCB 4.0中的Fi
- c++重载函数调用带有更多参数的自身版本