2

我的环境是 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". 删除它时,包括代码编译。有什么可以解决的方法吗?

4

1 回答 1

4

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

#define BOOST_THREAD_USES_MOVE

更多信息位于此处。这个定义模拟了一个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 接口。

于 2015-09-05T20:06:56.683 回答