ошибка компилятора при вызове boost::bind() внутри конструктора boost::thread

В настоящее время я пишу плагин firebreath C++ NPAPI и пытаюсь вызвать boost::thread изнутри плагина. Платформа, которую я создаю, — это Ubuntu Linux 13.04. Вот скелет объявления класса и соответствующие реализации функций-членов:

class EmulatorLaunchPluginAPI : public FB::JSAPIAuto
{
public:
   EmulatorLaunchPluginAPI(const EmulatorLaunchPluginPtr& plugin, 
                          const FB::BrowserHostPtr& host):m_plugin(plugin), m_host(host)
  {
      registerMethod("launch_emulator", 
                   make_method(this, &EmulatorLaunchPluginAPI::launch_emulator));
       registerMethod("launch_emulator_thread", 
                   make_method(this, &EmulatorLaunchPluginAPI::launch_emulator_thread));
  }
    virtual ~EmulatorLaunchPluginAPI() {};
    EmulatorLaunchPluginPtr getPlugin()
    {
        EmulatorLaunchPluginPtr plugin(m_plugin.lock());
        if (!plugin) {
            throw FB::script_error("The plugin is invalid");
        }
        return plugin;
    }  

    bool launch_emulator(const std::string& ,const FB::JSObjectPtr& )
    {
         emt(boost::bind(//boost::type<void>(),
        &EmulatorLaunchPluginAPI::launch_emulator_thread,
        this,
        cmd,
                callback));
        return true;
    }
    void launch_emulator_thread(const std::string& , const FB::JSObjectPtr& )
    {
         //thread body logic here
         int result = 0;
         result = invoke_command(cmd); 
         //callback to the browser
         callback->InvokeAsync("", FB::variant_list_of(shared_from_this())(result));
    }

private:
    int invoke_command(const std::string& )
    {
        int res = system("/usr/bin/firefox"); 
        return res;
    }

    EmulatorLaunchPluginWeakPtr m_plugin;
    FB::BrowserHostPtr m_host;
    boost::thread emt;  
};

I am getting the following compile error for the code fragmented highlighted above:

[ 54%] Создание проектов объектов CXX/EmulatorLaunchPlugin/CMakeFiles/EmulatorLaunchPlugin.dir/EmulatorLaunchPluginAPI.cpp.o /home/ajay/Downloads/firebreath-FireBreath-c335f5b/projects/EmulatorLaunchPlugin/EmulatorLaunchPluginAPI.cpp: в функции-члене 'bool EmulatorLaunchPluginAPI: :launch_emulator(const string&, const JSObjectPtr&)': /home/ajay/Downloads/firebreath-FireBreath-c335f5b/projects/EmulatorLaunchPlugin/EmulatorLaunchPluginAPI.cpp:94:30: ошибка: не соответствует вызову '(boost::thread) (boost::_bi::bind_t&, const boost::shared_ptr&>, boost::_bi::list3, boost::_bi::value >, boost::_bi::value > > >)' make[2]: * [projects/EmulatorLaunchPlugin/CMakeFiles/EmulatorLaunchPlugin.dir/EmulatorLaunchPluginAPI.cpp.o] Ошибка 1 make[1]: [projects/EmulatorLaunchPlugin/CMakeFiles/EmulatorLaunchPlugin.dir/all] Ошибка 2 make: ** [все] Ошибка 2

Я новичок в библиотеках Boost и пытался понять, как работает boost::bind, но не смог устранить эту ошибку. Может кто-нибудь помочь мне понять поведение компилятора?

С уважением, Аджай


person prabandham    schedule 16.08.2013    source источник
comment
пожалуйста, используйте комментарии C++, чтобы указать место ошибки, потому что '***emt(...' выглядит как тройное разыменование emt. и после следующего ; *** return мой внутренний парсер получил ICE %)   -  person zaufi    schedule 16.08.2013
comment
также есть что-то неправильное с сообщением об ошибке. это похоже на частичное копирование и вставку... call to ‘(boost::thread) (boost::_bi::bind_t&, const boost::shared_ptr&> -- я не вижу соответствующей открывающей угловой скобки   -  person zaufi    schedule 16.08.2013
comment
@zaufi : Спасибо за критику ... я заключил вывод компилятора в блочные кавычки, что привело к искажению текста ... пожалуйста, найдите исходную ошибку в исправленной версии сообщения ... С уважением, Аджай   -  person prabandham    schedule 16.08.2013


Ответы (2)


Попробуйте изменить строку на:

emt = boost::thread(&EmulatorLaunchPluginAPI::launch_emulator_thread, this, cmd, callback));
person taxilian    schedule 16.08.2013

Я до сих пор не вижу отчетливо сообщение об ошибке (особенно меня смущает shared_ptr без типа шаблона и висячий > после него), но я все равно вижу некоторые ошибки в вашем коде:

  1. launch_emulator использует что-то, что не наблюдается этим кодом. например что-то с именами cmd и callback. используя свою телепатию, я думаю, что пропущены имена параметров функции (я прав?)

  2. класс содержит неинициализированный экземпляр boost::thread -- вы должны инициализировать его в ctor, потому что этот класс не имеет копирующего ctor или оператора присваивания (для режима C++11 это есть переместить конструктор/назначить)

  3. в launch_emulator вы вызываете operator() для экземпляра boost::thread. у этого класса нет такого члена... поэтому я полагаю, что ваше сокращенное сообщение об ошибке об этом факте на самом деле...

person zaufi    schedule 16.08.2013
comment
Спасибо за комментарий относительно конструктора копирования... который решил мою проблему!! Я согласен, что это было очень просто :-)... я изменил emt из поля класса, чтобы сделать его локальной переменной launch_emulator(). Теперь код скомпилирован! - person prabandham; 17.08.2013