Инициализировать Boost shared_ptr в конструкторе

У меня есть класс, в котором есть объект boost :: asio :: io_service . Я хочу, чтобы этот объект хранился в boost :: shared_ptr .

Мой заголовок выглядит так (я избавился от ненужного кода, чтобы он не отвлекал)

class CommandDispatcher
{
private:
    boost::shared_ptr<boost::asio::io_service> m_ioservice;
public:
    CommandDispatcher();
};

Теперь, когда я создаю объект CommandDispatcher , я хочу, чтобы был io_service объект, который будет инициализирован для указателя. Теперь я не совсем понимаю, как это сделать. Я нашел два разных решения, но работает только одно, и я не совсем уверен, хорошее ли оно. Но посмотрите сами:

CommandDispatcher::CommandDispatcher()
{
    m_ioservice.reset(new boost::asio::io_service);            // this actually works
    //m_ioservice = boost::make_shared<boost::asio::io_service>
    //    (new boost::asio::io_service);                     // this doesn't work
}

Итак, вызов reset работает, но я думаю, что он на самом деле предназначен для переназначения указателя. Так что это не неправильно использовать его, но мне это не кажется лучшим решением.Предложение для вызова make_shared я нашел в другом вопросе. Но этот у меня просто не сработает (я реализовал его, как описано в официальном примере буста). Я получаю

/usr/local/include/boost/smart_ptr/make_shared.hpp:189: error: недопустимое преобразование из boost :: asio :: io_service * в size_t

/ usr / local / include /boost/smart_ptr/make_shared.hpp:189: ошибка: инициализация аргумента 1 'boost :: asio :: io_service :: io_service (size_t)'

Я не совсем уверен, как это сделать сейчас, что могло бы быть лучший способ (может быть, есть совершенно другой вариант). Или, может быть, я делаю все правильно, но что-то не так с io_service .

Надеюсь, этого вопроса здесь уже не было (я поискал какой-то старый вопрос, но ответ, похоже, мне не подошел).

7
задан Sam Miller 2 November 2012 в 00:12
поделиться