我已经在stackoverflow和cplusplus上研究了这个,并认为我已经正确地传递了一个函数作为参数,甚至“优雅”,但很明显我误解了一些东西。任何人都可以解释如何正确地传递函数作为参数,以及为什么我的工作不起作用?
为原型提供单个警告,为调用提供单个错误。在注释中将genX更改为genY,但genX和genY都有相同的警告/错误。
class MyClass {
typedef double (*func_t)(double sum);
void driver();
double genX(func_t fnc) { };
double genY(double (*funct)(double sum)) { };
// note: no known conversion for argument 1 from
// '<unresolved overloaded function type>' to
// MyClass::func_t {aka double (*)(double)}
double myThingie(double sum) { };
};
void MyClass::driver() {
genX(myThingie);
genY(myThingie);
// no matching function for call to 'MyClass::genX(<unresolved overloaded function type>)'
}
答案 0 :(得分:4)
“任何人都可以解释如何正确地将函数作为参数传递,以及为什么我的工作不起作用?”
你需要
typedef double (MyClass::*func_t)(double sum);
// ^^^^^^^^
声明成员类函数的函数指针。
获得他们的地址
genX(&MyClass::myThingie);
genY(&MyClass::myThingie);
答案 1 :(得分:1)
您的声明声明函数需要 free 函数指针,而不是成员函数指针。其次,您提供myThingie
的函数指针,它是MyClass
的成员函数,而不提供实例。阅读C函数指针,或者,如果可以的话,使用std::function来获得更多C ++的解决方案。
答案 2 :(得分:1)
尝试以下
class MyClass {
typedef double (MyClass::*func_t)(double sum);
void driver();
double genX(func_t fnc) { };
double genY(double (MyClass::*funct)(double sum)) { };
// note: no known conversion for argument 1 from
// '<unresolved overloaded function type>' to
// MyClass::func_t {aka double (*)(double)}
double myThingie(double sum) { };
};
void MyClass::driver() {
genX(&MyClass::myThingie);
genY(&MyClass::myThingie);
// no matching function for call to 'MyClass::genX(<unresolved overloaded function type>)'
}
答案 3 :(得分:0)
如果您坚持传递(类似C的非成员)函数指针,请使用(特别是为了可读性)typedef
(class
之外)来声明其签名:
typedef double func_sig_t(double);
然后传递一个指针,例如
double genX(func_sig_t* fnc) { };
但是,我会使用std::function
double genX(std::function<double(double)>);
它不那么便宜,但你可以通过一个lambda闭包,例如调用
double t;
double f = genX([=t](double x){return x+t;});
或者您想将指针传递给成员函数?它们有不同的语法!
答案 4 :(得分:0)
myThingie
是一个成员函数 - 指向它的指针的类型为double (MyClass::*)(double)
A&#34;指向成员的指针&#34;与常规指针完全不同,需要一个可以解除引用的合适类的实例。
您可以将myThingie
移出课堂,使其成为&#34;免费&#34;功能,
class MyClass {
typedef double (*func_t)(double sum);
void driver();
double genX(func_t fnc) { };
double genY(double (*funct)(double sum)) { };
};
double myThingie(double sum) { };
或调整类型:
class MyClass {
typedef double (MyClass::*func_t)(double sum);
double genX(func_t fnc) { };
double genY(double (MyClass::*funct)(double sum)) { };
double myThingie(double sum) { };
};
void MyClass::driver() {
genX(&MyClass::myThingie); // The "MyClass::" is important here, too.
genY(&MyClass::myThingie);
}
在这种情况下,您需要使用&#34;指向成员的指针&#34;取消引用语法来调用该函数 例如,
double genX(func_t fnc) { return (this->*fnc)(0.0) };