C++ 参数中的函数指针
我需要做一个函数,它向map添加一个函数指针。应该是这样的:C++ 参数中的函数指针,c++,function-pointers,C++,Function Pointers,我需要做一个函数,它向map添加一个函数指针。应该是这样的: bool RegisterFunction (string name, FunctionPointer function). 但我在调用它时遇到了问题,因为我不知道如何将函数传递给它,而不是传递函数的结果(当我在这里调用它时: RegisterFunction ("run", Run()) 它不起作用,在没有括号的情况下也不起作用,或者: *运行() &运行() *跑 &跑 如何解决这个问题 编辑: 错误是: parser.
bool RegisterFunction (string name, FunctionPointer function).
但我在调用它时遇到了问题,因为我不知道如何将函数传递给它,而不是传递函数的结果(当我在这里调用它时:
RegisterFunction ("run", Run())
它不起作用,在没有括号的情况下也不起作用,或者:
- *运行()
- &运行()
- *跑
- &跑
错误是:
parser.cpp|9|error: no matching function for call to
'MCXJS::Parser::RegisterFunction(const char [4], <unresolved overloaded function type>)'|
RegisterFunction()和Run()函数位于解析器类中,该类位于MCXJS命名空间中。班集体是:
class Parser
{
public:
Parser ();
CVariable RegisterFunction (FunctionPointer);
bool RegisterErrorHandler (ErrorType, ErrorHandlerPointer);
CVariable Run (std::string);
bool AlwaysDefaultErrorHandler;
int MaxCallStackSize;
private:
std::map <std::string, FunctionPointer> ExternalFunctions;
std::map <ErrorType, ErrorHandlerPointer> ErrorHandlers;
ErrorHandlerPointer DefaultErrorHandler;
};
Typedefs:
typedef CVariable (*FunctionPointer) (std::string);
typedef void (*ErrorHandlerPointer) (ErrorData);
是正确的方法。使用该方法会出现什么错误
我怀疑问题不在于您如何调用RegisterFunction,而在于您如何定义它。您给出了以下信息:
RegisterFunction (string name, FunctionPointer function).
但是省略FunctionPointer
的声明。它需要定义如下:
typedef void (*FunctionPointer)()
假设Run
定义为:
void Run();
请注意,要使其工作,与RegisterFunction
一起使用的所有函数必须具有相同的签名
更新:根据您在评论中提供的错误消息,问题似乎在于您有多个“Run”函数,而编译器不知道要传递哪个函数。(不幸的是,我不确定您如何澄清它,因此您可能希望重命名其中一个)
您可能想尝试的一件事是:
RegisterFunction (std::string("run"), Run);
给定第一个参数的精确匹配,它可以根据与FunctionPointer
中的签名匹配的函数来选择运行哪个函数
更新2:
您需要使Parser::Run()成为一个静态函数,并将FunctionPointer的声明更改为:
typedef CVariable (Parser::*FunctionPointer) (std::string);
是正确的方法。使用该方法会出现什么错误
我怀疑问题不在于您如何调用RegisterFunction,而在于您如何定义它。您给出了以下信息:
RegisterFunction (string name, FunctionPointer function).
但是省略FunctionPointer
的声明。它需要定义如下:
typedef void (*FunctionPointer)()
假设Run
定义为:
void Run();
请注意,要使其工作,与RegisterFunction
一起使用的所有函数必须具有相同的签名
更新:根据您在评论中提供的错误消息,问题似乎在于您有多个“Run”函数,而编译器不知道要传递哪个函数。(不幸的是,我不确定您如何澄清它,因此您可能希望重命名其中一个)
您可能想尝试的一件事是:
RegisterFunction (std::string("run"), Run);
给定第一个参数的精确匹配,它可以根据与FunctionPointer
中的签名匹配的函数来选择运行哪个函数
更新2:
您需要使Parser::Run()成为一个静态函数,并将FunctionPointer的声明更改为:
typedef CVariable (Parser::*FunctionPointer) (std::string);
只需传递函数名,无需任何修饰或括号:
RegisterFunction(name, Run);
但是,以下各项也应起作用:
RegisterFunction(name, &Run);
只需传递函数名,无需任何修饰或括号:
RegisterFunction(name, Run);
但是,以下各项也应起作用:
RegisterFunction(name, &Run);
Run
是一个非静态成员函数,不是一个普通函数,因此您可能注册了错误类型的内容,或者需要更改typedef
以引用指向成员的指针
例如
那么,形成指向成员的指针的正确方法是:
RegisterFunction("run", &Parser::Run);
请注意,您必须将*
或->*
运算符分别与对象或对象指针一起使用,才能通过指向成员的指针调用成员函数。Run
是一个非静态成员函数,而不是普通函数,因此您要么注册了错误类型的内容,要么需要更改y我们的typedef
引用指向成员的指针
例如
那么,形成指向成员的指针的正确方法是:
RegisterFunction("run", &Parser::Run);
请注意,您必须将*
或->*
运算符分别与对象或对象指针一起使用,才能通过指向成员的指针调用成员函数。注册表函数的声明是什么样子的,函数指针是什么,以及运行是如何声明的?&Run如果Run
的声明可见(并且它确实是一个函数),则code>或Run
应该都可以工作。你能用所有相关类型和声明更新你的问题吗?“FunctionPointer”和“Run”的定义是什么?好的,编辑后。你不能将Run
传递给需要普通函数指针的函数,因为Run
是一个非静态成员函数。指向成员的指针和函数指针的类型截然不同你能不能再举一些外部函数的例子?它们必须是非静态成员函数吗?你希望有多少个非静态成员函数,它们的百分比是多少。你打算在哪里保存这些非静态成员函数的类实例的引用或指针即将开始工作?您考虑过了吗?还将涉及哪些类?RegisterFunction
的声明是什么样子的,什么是FunctionPointer
,以及Run
是如何声明的?&Run
或Run
如果Run
的声明可见,这两个类都应该工作吗(这确实是一种功能)。你能用所有相关类型和声明更新你的问题吗?“FunctionPointer”和“Run”的定义是什么?好的,编辑后。你不能将Run
传递给需要普通函数指针的函数,因为Run
是一个非静态成员函数。指向成员的指针和函数指针的类型截然不同你不能在需要另一个的地方使用一个。你能再举一些外部函数的例子吗?它们必须是b吗