C++函数指针类未在 GCC 中编译
C++ function pointer class not compiling in GCC?
我正在尝试创建一个可以容纳并稍后调用函数的类。它将函数与保存函数名称的字符串一起存储在映射中。
我尝试在带有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;
}
要有一个不带参数并返回 void 的函数指针映射,您需要:
std::map<std::string, void(*)()> functionsMap;
将模板add_func
是没有意义的,因为它只有在使用 ReturnValue = void
实例化时才有效(除非您在其实现中添加了可能不安全的强制转换)。
如果你的代码使用 Visual C++ 进行编译,那是因为 Visual C++ 是宽松的。
您可以将该函数作为参数传递,如下所示:
void add(void * f()){...}
如何在 C 中将函数作为参数传递?
考虑使用 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"; } );
相关文章:
- 为什么 gcc 编译这个而 msvc 没有
- 错误:使用 clang 没有可行的重载,使用 GCC 编译
- 带有自动参数的函数使用 GCC 编译,但不使用 Visual C++ 编译
- 使用 MINGW gcc 编译时,不会为 std::string 调用重载的新运算符
- Steam 回调在 Linux / GCC 编译期间触发警告
- 在其他容器中使用 boost::container::static_vector 时,GCC 编译错误"将'const s'绑定到类型's&'的引用丢弃限定符"
- 如何使用 GCC 编译指示启用选项 '-Werror'?
- 如何实现使用 gcc-4.4 编译的大向量初始化?
- 关于这个在 Linux 上使用 gcc 编译的程序中的 vtable,nm 告诉我什么?
- 使用 TDM GCC 5.1.0 编译 PDCurses36 时出错
- 为什么这段代码无法使用 gcc 4.8.5 编译,而使用 clang 编译正常
- 使用 std::addressof 时出现 GCC 7 编译错误
- 在类模板上使用 arm gcc 编译期间的隔离错误
- 使用 GCC 编译C++时如何包含 C11 标头?
- 类数据成员指针的非类型模板参数包无法使用 gcc 编译
- 是否可以使用 GCC 编译具有特定编译器标志的代码文件的一部分?
- 将 cctype 函数分配给 std::function,gcc 编译错误
- GCC 编译时出现警告:未知转义序列:"\040"
- 为什么以下代码不使用GCC编译,而是用Clang编译罚款
- GCC编译器,为较低版本的GCC编译应用程序