Boost可选的Boost线程编译问题

Boost Optional with Boost Thread compilation issue

本文关键字:Boost 编译 问题 线程      更新时间:2023-10-16

我的环境是Visual studio 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>------构建启动:项目:TestBoostOptional,配置:Debug x64 ------1> main.cpp1>c:workspacethird_partyboost_1_59_0boost/optional/optional.hpp(297):错误C2664: 'void boost::optional_detail::optional_base::construct(MyClass &&)':无法将参数1从'boost::detail::thread_move_t'转换为'const MyClass &'1> 与1> [1> T = MyClass1> ]1>原因:无法从'boost::detail::thread_move_t'转换为'const MyClass'1> 与1> [1> T = MyClass1> ]1>没有可执行此转换的用户定义转换操作符,或者无法调用该操作符1> c:workspacethird_partyboost_1_59_0boost/optional/optional.hpp(292):在编译类模板成员函数'boost::optional_detail::optional_base::optional_base(boost::optional_detail::optional_base &&)'时1> 与1> [1> T = MyClass1> ]1> c:workspacethird_partyboost_1_59_0boost/optional/optional.hpp(873):参见参考函数模板实例化'boost::optional_detail::optional_base::optional_base(boost::optional_detail::optional_base &&)'正在编译1> 与1> [1> T = MyClass1> ]1> c:workspacethird_partyboost_1_59_0boost/optional/optional.hpp(766):参考类模板实例化'boost::optional_detail::optional_base'正在编译1> 与1> [1> T = MyClass1> ]1> main.cpp(14):参见正在编译的类模板实例化'boost::optional'的参考之前

注意#include "boost/thread.hpp"。当删除它时,包括代码编译。有什么可以解决的吗?

您必须在使用任何boost头之前定义BOOST_THREAD_USES_MOVE

#define BOOST_THREAD_USES_MOVE

更多信息在这里。这个定义模拟了Boost.Move的移动,这在这里是必要的。

为了实现Movable类,移动参数并返回类型的提升。线程在编译器支持时使用右值引用它。在不支持它的编译器上。线程使用由Boost提供的仿真。控件提供的模拟以前版本的Boost。线程取决于是否是否定义BOOST_THREAD_USES_MOVE。此宏由BOOST_THREAD_VERSION为2时的默认值。从BOOST_THREAD_VERSION 3开始,BOOST_THREAD_USES_MOVE已定义

参见Boost。移动:

提振。线程默认使用内部移动语义实现。从3.0.0版本开始,您可以使用提供的移动仿真Boost.Move。

当BOOST_THREAD_VERSION==2时,定义BOOST_THREAD_USES_MOVE使用Boost。移动界面。当BOOST_THREAD_VERSION==3定义BOOST_THREAD_DONT_USE_MOVE,如果你不想使用Boost。移动接口。