Boost可选的Boost Thread编译问题

时间:2015-09-05 20:03:43

标签: c++ boost boost-thread boost-optional

我的环境是Visual Stuido 2013,VC12,Boost 1.59。 以下代码(真实代码的最小重复):

#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"。删除此包含代码编译。有什么办法可以解决吗?

1 个答案:

答案 0 :(得分:4)

在使用任何boost标头之前,您必须定义ProgressBar

BOOST_THREAD_USES_MOVE

更多信息位于here。此定义模拟此处必需的#define BOOST_THREAD_USES_MOVE 移动。

  

为了实现Movable类,移动参数并返回   类型Boost.Thread在编译器支持时使用rvalue引用   它。在不支持它的编译器上Boost.Thread使用了   Boost.Move提供的仿真或由。提供的仿真   以前版本的Boost.Thread取决于是否   BOOST_THREAD_USES_MOVE是否已定义。这个宏没有设置   BOOST_THREAD_VERSION为2时的默认值。自BOOST_THREAD_VERSION 3起,   BOOST_THREAD_USES_MOVE已定义。

另见Boost.Move

  

Boost.Thread默认使用内部移动语义实现。   从3.0.0版开始,您可以使用提供的移动仿真模拟   通过Boost.Move。

     

如果你想要BOOST_THREAD_VERSION == 2定义BOOST_THREAD_USES_MOVE   使用Boost.Move接口。当BOOST_THREAD_VERSION == 3时定义   BOOST_THREAD_DONT_USE_MOVE如果您不想使用Boost.Move   接口