C++ 使用带有基类的已删除函数 std::unique_ptr
Posted
技术标签:
【中文标题】C++ 使用带有基类的已删除函数 std::unique_ptr【英文标题】:C++ use of deleted function std::unique_ptr with Base class 【发布时间】:2017-01-23 14:12:49 【问题描述】:我有一个矢量或游戏对象。我必须为 c++11 编译
std::vector< std::unique_ptr<Game> > games_;
Game是基类,定义如下
class Game
public:
Game(int id, const std::string& name)
: id_(id), name_(name)
virtual ~Game();
int play(int w);
virtual void validate() = 0;
int id_;
std::string name_;
;
派生类只实现了 validate() 方法。
现在我的经理类想要将“玩游戏”发布到线程池。这样做:
void Manager::playGames()
boost::asio::io_service ioservice;
std::unique_ptr<boost::asio::io_service::work> work( new boost::asio::io_service::work(ioService));
boost::thread_group threadpool; //pool
std::cout << "will start for " << playthreads_ << " threads and " << getTotalRequests() << "total requests\n";
for (std::size_t i = 0; i < playthreads_; ++i)
threadpool.create_thread(boost::bind(&boost::asio::io_service::run, &ioService));
for ( std::size_t i=0; i < w_.size(); i++)
ioService.post(boost::bind(&Game::play, games_[i], 2));
work.reset();
threadpool.join_all();
ioService.stop();
错误是
/home/manager.cpp: In member function ‘void Manager::playGames()’: /home//manager.cpp:65:74: error: use of deleted function ‘std::unique_ptr<_Tp, _Dp>::unique_ptr(const std::unique_ptr<_Tp, _Dp>&) [with _Tp = Game; _Dp = std::default_delete<Game>]’ ioService.post(boost::bind(&Game::play, games_[i], 2)); ^ In file included from /opt/5.2/include/c++/5.2.0/memory:81:0, from /home/manager.hpp:5, from /home/manager.cpp:1: /opt/5.2/include/c++/5.2.0/bits/unique_ptr.h:356:7: note: declared here unique_ptr(const unique_ptr&) = delete;
【问题讨论】:
您以某种方式请求了 unique_ptr 的副本,该副本已被删除,因为它们被定义为仅移动。 【参考方案1】:对于boost::bind(&Game::play, games_[i], 2)
,games_[i]
被复制到bind,但std::unique_ptr
不能被复制。 (只能移动,但我认为移动到这里不符合要求。)
您可以使用boost::ref
来避免复制,例如
ioService.post(boost::bind(&Game::play, boost::ref(games_[i]), 2));
【讨论】:
错误:没有匹配函数调用'get_pointer(std::reference_wrapper<:unique_ptr> >&)' 用 boost::ref 编译 @cateof 抱歉,我无法使用 boost 对其进行测试,我认为您是对的。顺便说一句,std::bind
和 std::ref
很好。以上是关于C++ 使用带有基类的已删除函数 std::unique_ptr的主要内容,如果未能解决你的问题,请参考以下文章