调用std::function指针编译报错:被调用对象非函数或函数指针
编译错误:std::function被识别为指针而非函数的问题
错误信息
misc/event.inl:59:13: error: called object type 'std::function<void (T1 *, T2 *)> *' is not a function or function pointer (*callback).func(args...); ^~~~~~~~~~~~~~~
相关代码片段
template <typename... Args> struct callback { std::function<void(Args... args)> *func; bool destructive; } // this->callbacks is of type std::vector<std::shared_ptr<callback>> template <typename... Args> bool callbackHandler<Args...>::trigger(Args... args) { for (auto &callback : *(this->callbacks)) { printf("%i", callback->destructive); (*callback).func(args...); if (callback->destructive) { this->remove(callback); } } return true; }
问题分析与修复
这是代码写法错误,和编译器无关。
错误核心:callback结构体中的func是std::function的指针类型,但你调用(*callback).func(args...)时,实际是在尝试调用指针本身——指针并不是可调用对象,因此编译器报错。
修复方案
有两种可行的修复方式:
解引用指针后调用
调整调用代码,先获取指针指向的std::function对象,再执行调用:// 写法一:完整解引用 (*(*callback).func)(args...); // 写法二:用箭头简化,更直观 (*callback->func)(args...);将func改为非指针类型(推荐)
除非你有必须使用指针的特殊场景,否则直接把func定义为std::function对象而非指针,代码会更简洁安全:template <typename... Args> struct callback { std::function<void(Args... args)> func; // 移除* bool destructive; }; // 补上结构体末尾的分号(之前的代码漏掉了,会导致编译错误)修改后调用代码直接写成:
callback->func(args...);
另外注意:原代码中callback结构体定义末尾缺少分号,这也是一个潜在的编译问题,必须补上。
内容的提问来源于stack exchange,提问作者7Bit
相关产品推荐
相关产品推荐

