参数中的函数指针

时间:2010-08-23 19:08:43

标签: c++ function-pointers

我需要创建一个向map添加函数指针的函数。它会是这样的:

bool RegisterFunction (string name, FunctionPointer function).

但我调用它有问题,因为我不知道如何将函数传递给它而不是函数的结果(当我在这里调用它时:

RegisterFunction ("run", 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);  

3 个答案:

答案 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);