C ++函数指针类在GCC中不编译?

时间:2012-05-14 20:46:14

标签: c++ function pointers

我正在尝试创建一个可以保存并稍后调用函数的类。它将函数与一个包含函数名称的字符串一起存储在映射中。

我尝试在使用GCC的Linux上执行此操作,并在"invalid conversion from void(*)() to void *"

行上遇到以下错误:functionsMap[nameOfFunction] = func;

这是我到目前为止的整个程序。它还没有完成,但我真的很好奇为什么这将在Visual C ++而不是GCC下编译。如果我做错了或者可能做得更好,请告诉我。谢谢!

#include <iostream>
#include <map>
#include <string>
using namespace std; 

class Dyn_Class{
private: 
    map<string, void *> functionsMap; 

public: 
    Dyn_Class(){} 

    template<typename ReturnValue>
    void add_func( string nameOfFunction, ReturnValue(*func)() ){
        functionsMap[nameOfFunction] = func; 
    }

    void remove_func( string nameOfFunction ){

    }

    Dyn_Class operator()(string nameOfFunction){

    }
}; 

void print(void){
    for(int index = 0; index < 9; index++){
        cout << index << "   "; 
    }
    cout << endl; 
}

int main(){
    Dyn_Class functionsList; 

    functionsList.add_func("print", print); 

    return 0; 
}

3 个答案:

答案 0 :(得分:2)

要有一个指向函数的指针映射,不需要参数并返回void,你需要:

std::map<std::string, void(*)()> functionsMap; 

add_func作为模板是没有意义的,因为只有在使用ReturnValue = void进行实例化时才会有效(除非您在其实现中添加了可能不安全的强制转换)。

如果您的代码使用Visual C ++编译,那是因为Visual C ++是允许的。

答案 1 :(得分:0)

您可以将该函数作为参数传递:

void add(void * f()){...}

How do you pass a function as a parameter in C?

答案 2 :(得分:0)

考虑使用std :: function代替:

class Dyn_Class{
private: 
    map<string, function<void()> > functionsMap; 

public: 
    Dyn_Class(){} 

    template<typename FUNC>
    void add_func(const string& nameOfFunction, FUNC func){
        functionsMap.insert(make_pair(nameOfFunction, func));
    }

    void remove_func(const string& nameOfFunction ){

    }

    void operator()(const string& nameOfFunction){
        functionsMap[nameOfFunction]();
    }
}; 

好处?使用“function”,您可以使用普通的旧函数指针,可以使用仿函数,也可以使用lambda表达式代替:

DynClass dyn;
dyn.add("print", []() { printf("Say hi"; } );