默认参数和函数指针作为函数参数C ++
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了默认参数和函数指针作为函数参数C ++相关的知识,希望对你有一定的参考价值。
我有一个接受参数,默认参数,最后是指向另一个函数的指针和空指针的函数。
作为示例,请考虑以下内容
int foo(double arg 1, bool arg 2, int arg3=0, int arg4=2, bool (*pbar)(bool,void*), void* data=0);
它在我的代码库中的多个地方都被调用。我注意到,当函数指针本身具有参数,然后是默认参数时,即使我想要的值是默认值,也必须指定默认参数。例如,以下代码将编译
foo(arg1, arg2, pbar);
但是下面的代码段不会
foo(arg1, arg2, pbar, (void*) myint);
作为更完整的示例,这是一个有效的代码段。
#include <iostream>
using namespace std;
int foo(double arg1, bool arg2, int arg3=0, int arg4=2, bool (*pbar)(bool,void*)=0, void* data=0)
{
return 1;
}
bool bar(bool bt, void* vs)
{
return false;
}
int main()
{
double arg1 = 0.0;
bool arg2 = false;
bool bt = true;
int i = 1;
void* vs = &i;
bool pbar = bar(bt, vs);
// no defaults specified and no function pointer arguments
foo(arg1, arg2, pbar);
// specify one of the defaults
int arg3 = 23;
foo(arg1, arg2, arg3, pbar);
// don't specify the defaults, but give arguments to function pointer
//foo(arg1, arg2, pbar, bt, vs);
return 0;
}
最终评论通话将无法编译。
所以我的问题是,为什么在指定函数指针参数时,它不能编译?
我已经通过使用'命名参数'方法找到了解决问题的方法。因此,我创建一个类并使用引用实例化成员。但是,我有兴趣对上述失败的原因进行深入的解释。
下面显示错误
main.cpp: In function ‘int main()’:
main.cpp:41:33: error: invalid conversion from ‘void*’ to ‘bool (*)(bool, void*)’ [-fpermissive]
foo(arg1, arg2, pbar, bt, vs);
^
main.cpp:13:5: note: initializing argument 5 of ‘int foo(double, bool, int, int, bool (*)(bool, void*), void*)’
int foo(double arg1, bool arg2, int arg3=0, int arg4=2, bool (*pbar)(bool,void*)=0, void* data=0)
^~~
我相信这是因为参数顺序混乱了。但是,为什么我可以插入函数指针,而不用担心默认的arg3和arg4?
答案
int foo(double arg1, bool arg2, int arg3 = 0, int arg4 = 2, bool * pbar(bool , void *) = 0, void * data = 0);
编译器仅关心参数的顺序。
您不能跳过对arg3和arg4的定义,因为它们具有默认值。
通过这样做:
foo(arg1, arg2, pbar);
您基本上传递了“ pbar”(它是一个函数),其中“ arg3”应该是(它是一个整数)]
以上是关于默认参数和函数指针作为函数参数C ++的主要内容,如果未能解决你的问题,请参考以下文章
C 语言结构体 ( 结构体作为函数参数 | 结构体指针作为函数参数 )