2015-09-05 1 views
2

Моя среда Visual Stuido 2013, VC12, Boost 1.59. Следующий код (минимальный репро реального кода):Boost Optional with Boost Thread компиляция проблема

#include "boost/thread.hpp" 
#include "boost/optional.hpp" 

class MyClass 
{ 
public: 

    template <typename T> 
    operator const T&() const; 

}; 

boost::optional<MyClass> foo() 
{ 
    boost::optional<MyClass> res; 
    return res; 
} 

int main(int argc) 
{ 
    foo(); 
} 

не компилируется, ошибка:

 
    1>------ Build started: Project: TestBoostOptional, Configuration: Debug x64 ------ 
    1> main.cpp 
    1>c:\workspace\third_party\boost_1_59_0\boost/optional/optional.hpp(297): error C2664: 'void boost::optional_detail::optional_base::construct(MyClass &&)' : cannot convert argument 1 from 'boost::detail::thread_move_t' to 'const MyClass &' 
    1>   with 
    1>   [ 
    1>    T=MyClass 
    1>   ] 
    1>   Reason: cannot convert from 'boost::detail::thread_move_t' to 'const MyClass' 
    1>   with 
    1>   [ 
    1>    T=MyClass 
    1>   ] 
    1>   No user-defined-conversion operator available that can perform this conversion, or the operator cannot be called 
    1>   c:\workspace\third_party\boost_1_59_0\boost/optional/optional.hpp(292) : while compiling class template member function 'boost::optional_detail::optional_base::optional_base(boost::optional_detail::optional_base &&)' 
    1>   with 
    1>   [ 
    1>    T=MyClass 
    1>   ] 
    1>   c:\workspace\third_party\boost_1_59_0\boost/optional/optional.hpp(873) : see reference to function template instantiation 'boost::optional_detail::optional_base::optional_base(boost::optional_detail::optional_base &&)' being compiled 
    1>   with 
    1>   [ 
    1>    T=MyClass 
    1>   ] 
    1>   c:\workspace\third_party\boost_1_59_0\boost/optional/optional.hpp(766) : see reference to class template instantiation 'boost::optional_detail::optional_base' being compiled 
    1>   with 
    1>   [ 
    1>    T=MyClass 
    1>   ] 
    1>   main.cpp(14) : see reference to class template instantiation 'boost::optional' being compiled 

Обратите внимание на #include "boost/thread.hpp". При удалении это включает компиляцию кода. Что-нибудь, что можно сделать для обхода?

ответ

3

Вы должны определить BOOST_THREAD_USES_MOVE, прежде чем использовать заголовок форсирования.

#define BOOST_THREAD_USES_MOVE 

Подробная информация находится here. Это определит эмулирует движение на Boost.Move, которое необходимо здесь.

In order to implement Movable classes, move parameters and return types Boost.Thread uses the rvalue reference when the compiler support it. On compilers not supporting it Boost.Thread uses either the emulation provided by Boost.Move or the emulation provided by the previous versions of Boost.Thread depending whether BOOST_THREAD_USES_MOVE is defined or not. This macros is unset by default when BOOST_THREAD_VERSION is 2. Since BOOST_THREAD_VERSION 3, BOOST_THREAD_USES_MOVE is defined.

Также см Boost.Move:

Boost.Thread uses by default an internal move semantic implementation. Since version 3.0.0 you can use the move emulation emulation provided by Boost.Move.

When BOOST_THREAD_VERSION==2 define BOOST_THREAD_USES_MOVE if you want to use Boost.Move interface. When BOOST_THREAD_VERSION==3 define BOOST_THREAD_DONT_USE_MOVE if you don't want to use Boost.Move interface.

+0

Впечатляющие ответ. Что-то я не знал. И с полезными документами цитатами и ссылками. Что еще мы можем попросить :) – sehe

+0

Принимая это, еще один вариант: '#define BOOST_THREAD_VERSION 3'. Однако это не объясняет, почему это происходит. –

 Смежные вопросы

  • Нет связанных вопросов^_^