lundi 23 janvier 2017

C++ use of deleted function ‘std::unique_ptr with Base class

I have a vector or Game objects.

std::vector< std::unique_ptr > games_;

Game is the base class, defined like this

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_;

};

The derived class just implements the validate() method.

Now my manager class wants to post a "play game" to a thread pool. Done like this:

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();

}

The error is

/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]’ 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;

Aucun commentaire:

Enregistrer un commentaire