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

C++ C++;函数指针类未在GCC中编译?,c++,function,pointers,C++,Function,Pointers,我正在尝试创建一个可以保存和稍后调用函数的类。它将函数与保存函数名称的字符串一起存储在映射中 我尝试在Linux上使用GCC执行此操作,并得到以下错误:“从void(*)到void*的转换无效”在functionsMap[nameOfFunction]=func一行 这是我到目前为止的全部计划。它还没有完成,但我很好奇为什么会在VisualC++和GCC下编译。如果我做错了什么或者可以做得更好,请告诉我。谢谢 #include <iostream> #include <map&

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

我尝试在Linux上使用GCC执行此操作,并得到以下错误:
“从void(*)到void*的转换无效”
functionsMap[nameOfFunction]=func一行

这是我到目前为止的全部计划。它还没有完成,但我很好奇为什么会在VisualC++和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; 
}
#包括
#包括
#包括
使用名称空间std;
类Dyn_类{
私人:
地图功能地图;
公众:
Dyn_类(){}
模板
void add_func(字符串名称函数,返回值(*func)(){
functionsMap[nameOfFunction]=func;
}
void remove_func(字符串名称函数){
}
Dyn_类运算符()(字符串名称函数){
}
}; 
作废打印(作废){
对于(int-index=0;index<9;index++){

要获得指向函数的指针映射(不带参数并返回void),您需要:

std::map<std::string, void(*)()> functionsMap; 
std::映射函数映射;
add_func
作为模板是没有意义的,因为它只有在使用
ReturnValue=void
实例化时才会起作用(除非您将潜在的不安全强制转换添加到其实现中)


<>如果你的代码用VisualC++编写,那是因为VisualC++是许可的。

< p>你可以把这个函数传递成这样的参数:

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

考虑改用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]();
    }
}; 

如果我希望映射能够接受一个具有可变参数数的函数,并重载add_func以接受具有参数的函数,该怎么办?@d2jxp:函数指针不能这样做,因为函数签名是函数指针类型的一部分。当您重试时,您如何正确调用任何函数从地图上看到他们了吗?
DynClass dyn;
dyn.add("print", []() { printf("Say hi"; } );