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
相关产品推荐
相关产品推荐

