如何解决函数指针问题:如何提供从非成员函数到成员函数的指针
class Alpha{
public:
Alpha(void* p(int,int) = nullptr);
void* calculatePointer;
void test();
};
Alpha::Alpha(void* p(int,int)) : calculatePointer(p){};
Alpha::test(){
calculatePointer(5,10);
}
void calculate(int a,int b){
std::cout << "cum: " << a +b << "\n";
}
int main(){
Alpha A = Alpha(&calculate);
A.test();
}
并导致这些错误:
error: invalid conversion from ‘void* (*)(int,int)’ to ‘void*’ [-fpermissive]
15 | : calculatePointer(p),| ^
| |
| void* (*)(int,int)
error: cannot initialize a member subobject of type 'void *' with an lvalue of type 'void *(*)(int,int)'
error: expression cannot be used as a function
In constructor 'Alpha::Alpha(void* (*)(int,int))':
error: invalid conversion from 'void (*)(int,int)' to 'void* (*)(int,int)' [-fpermissive]
note: initializing argument 1 of 'Alpha::Alpha(void* (*)(int,int))'
解决方法
如果您对函数指针的确切语法感到困惑,最好定义一个类型别名。
如果您使用 using
,则“rhs”为 <return type> (*)(<parameter types>)
class Alpha{
public:
using FunctionPtr = void (*)(int,int);
Alpha(FunctionPtr p = nullptr) : calculatePointer(p) {}
FunctionPtr calculatePointer;
void test()
{
if (calculatePointer != nullptr)
{
calculatePointer(5,10);
}
}
};
void calculate(int a,int b){
std::cout << "sum: " << (a + b) << "\n";
}
顺便说一句:没有类型别名的正确语法是
Alpha(void (*p)(int,int) = nullptr);
括号是必需的,因为编译器将 void *p(int,int)
视为 (void*) p(int,int)
。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。