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