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

C++从main向类方法传递函数指针时编译错误求助

解决std::unique_ptr拷贝构造函数被删除的编译错误

错误原因

编译错误C2280的核心原因是:std::unique_ptr是独占式智能指针,它的拷贝构造函数被标准库显式删除了——设计上不允许拷贝unique_ptr,避免同一内存被多个指针同时拥有。

你的代码中,post2函数的第一个参数是按值传递unique_ptr<Poster<T>> p,当你在post里调用post2(testPtr, callback_function, data)时,编译器会尝试把testPtr拷贝给形参p,这直接触发了被删除的拷贝构造函数,导致编译失败。

解决方案

根据你对unique_ptr的使用需求,有两种可行方案:

方案1:按引用传递(无需转移所有权)

如果post2只是需要访问unique_ptr指向的对象,不需要接管所有权,把参数改成引用传递即可,这样不会触发拷贝:

template<class T>
class Poster
{
private:
    unique_ptr<Poster<T>> testPtr = nullptr;
public:
    void post(void (*callback_function)(T), T data)
    {           
        post2(testPtr, callback_function, data);
    }

    // 改成const引用(如果不需要修改指针)或非const引用(如果需要修改指针)
    void post2(const unique_ptr<Poster<T>>& p, void (*callback_function)(T), T data)
    {
        callback_function(data);
        // 后续如果需要使用p,比如p->some_method(),直接用即可
    }
};

方案2:转移所有权(如果需要让post2接管指针)

如果post2需要完全接管testPtr的所有权,使用std::move把unique_ptr的所有权转移给post2的形参,此时调用的是unique_ptr的移动构造函数(而非拷贝构造):

#include <utility> // 必须包含这个头文件才能用std::move

template<class T>
class Poster
{
private:
    unique_ptr<Poster<T>> testPtr = nullptr;
public:
    void post(void (*callback_function)(T), T data)
    {           
        // 用std::move转移所有权
        post2(std::move(testPtr), callback_function, data);
        // 注意:此时testPtr已经变成空指针,后续使用前要做空检查
    }

    void post2(unique_ptr<Poster<T>> p, void (*callback_function)(T), T data)
    {
        callback_function(data);
        // p现在拥有原testPtr的所有权
    }
};

额外说明

你的当前代码中post2并没有实际使用参数p,如果后续也不需要这个指针,完全可以直接删除该参数,这样也能解决错误。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.16 04:40:29