【问题标题】:Boost Optional with Boost Thread compilation issueBoost Optional with Boost Thread 编译问题
【发布时间】:2015-12-01 17:48:27
【问题描述】:

我的环境是 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>----- 构建开始:项目:TestBoostOptional,配置:Debug x64 ------ 1> 主.cpp 1>c:\workspace\third_party\boost_1_59_0\boost/optional/optional.hpp(297): 错误 C2664: 'void boost::optional_detail::optional_base::construct(MyClass &&)' : 不能从'boost 转换参数 1 ::detail::thread_move_t' 到 'const MyClass &' 1> 与 1> [ 1> T=我的班级 1>] 1> 原因:无法从 'boost::detail::thread_move_t' 转换为 'const MyClass' 1> 与 1> [ 1> T=我的班级 1>] 1> 没有可以执行此转换的用户定义转换运算符,或者无法调用该运算符 1> c:\workspace\third_party\boost_1_59_0\boost/optional/optional.hpp(292) : 在编译类模板成员函数'boost::optional_detail::optional_base::optional_base(boost::optional_detail::optional_base &&)' 1> 与 1> [ 1> T=我的班级 1>] 1> c:\workspace\third_party\boost_1_59_0\boost/optional/optional.hpp(873) :参见函数模板实例化的参考'boost::optional_detail::optional_base::optional_base(boost::optional_detail::optional_base &&)'正在编译 1> 与 1> [ 1> T=我的班级 1>] 1> c:\workspace\third_party\boost_1_59_0\boost/optional/optional.hpp(766) : 请参阅正在编译的类模板实例化 'boost::optional_detail::optional_base' 的引用 1> 与 1> [ 1> T=我的班级 1>] 1> main.cpp(14) : 请参阅正在编译的类模板实例化 'boost::optional' 的引用

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

【问题讨论】:

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


    【解决方案1】:

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

    #define BOOST_THREAD_USES_MOVE
    

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

    为了实现Movable类,移动参数并返回 类型 Boost.Thread 在编译器支持时使用右值引用 它。在不支持它的编译器上,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 界面。

    【讨论】:

    • 令人印象深刻的答案。我不知道的东西。并提供有用的文档报价和链接。我们还能要求什么:)
    • 接受这个,另一个选择是#define BOOST_THREAD_VERSION 3。然而,这并不能解释为什么会发生这种情况。
    猜你喜欢
    • 2013-11-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-11-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多