You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

调用std::function指针编译报错:被调用对象非函数或函数指针

编译错误:std::function被识别为指针而非函数的问题

错误信息

misc/event.inl:59:13: error: called object type 'std::function<void (T1 *, T2 *)&gt; *' 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...)时,实际是在尝试调用指针本身——指针并不是可调用对象,因此编译器报错。

修复方案

有两种可行的修复方式:

  1. 解引用指针后调用
    调整调用代码,先获取指针指向的std::function对象,再执行调用:

    // 写法一:完整解引用
    (*(*callback).func)(args...);
    // 写法二:用箭头简化,更直观
    (*callback->func)(args...);
    
  2. 将func改为非指针类型(推荐)
    除非你有必须使用指针的特殊场景,否则直接把func定义为std::function对象而非指针,代码会更简洁安全:

    template <typename... Args>
    struct callback
    {
        std::function<void(Args... args)> func; // 移除*
        bool destructive;
    }; // 补上结构体末尾的分号(之前的代码漏掉了,会导致编译错误)
    

    修改后调用代码直接写成:

    callback->func(args...);
    

另外注意:原代码中callback结构体定义末尾缺少分号,这也是一个潜在的编译问题,必须补上。

内容的提问来源于stack exchange,提问作者7Bit

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.07 19:50:06