我需要创建一个向map添加函数指针的函数。它会是这样的:
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()函数位于Parser类中,该类位于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;
};
和parser.cpp文件:
Parser::Parser ():
AlwaysDefaultErrorHandler (true), MaxCallStackSize (4)
{
RegisterFunction ("run", Run);
};
CVariable Parser::Run (std::string path)
{
return 5;
};
Typedef:
typedef CVariable (*FunctionPointer) (std::string);
typedef void (*ErrorHandlerPointer) (ErrorData);
答案 0 :(得分:3)
Run
是非静态成员函数,而不是普通函数,因此您要么注册了错误类型的某些内容,要么需要更改typedef
以引用指向成员的指针
E.g。
typedef CVariable (Parser::*FunctionPointer) (std::string);
然后,形成指向成员的指针的正确方法是:
RegisterFunction("run", &Parser::Run);
请注意,您必须使用.*
或->*
运算符分别使用对象或对象指针通过指向成员的指针调用成员函数。
答案 1 :(得分:1)
RegisterFunction ("run", Run)
是正确的方法。你使用它有什么错误?
我怀疑问题不在于你如何调用RegisterFunction,而在于你如何定义它。你给我们这个:
RegisterFunction (string name, FunctionPointer function).
但遗漏了FunctionPointer
的声明。它需要定义如下:
typedef void (*FunctionPointer)()
假设Run
被定义为:
void Run();
请注意,为了实现此功能,您与RegisterFunction
一起使用的所有功能必须具有相同的签名。
更新:根据您在注释中提供的错误消息,似乎问题是您有多个“运行”功能,并且编译器不知道您要传递哪个。 (不幸的是,我不确定你如何澄清它,所以你可能希望重命名其中一个)
您可能想要尝试的一件事是:
RegisterFunction (std::string("run"), Run);
鉴于第一个参数的完全匹配,它可以根据Run
中的签名选择哪个FunctionPointer
函数。
更新2: 您将需要使Parser :: Run()成为静态函数,将FunctionPointer的声明更改为:
typedef CVariable (Parser::*FunctionPointer) (std::string);
答案 2 :(得分:0)
您可以直接传递函数的名称,不带任何装饰或任何括号:
RegisterFunction(name, Run);
但是,以下内容也应该有效:
RegisterFunction(name, &Run);