2

私の環境は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.cpp
    1>c:\workspace\third_party\boost_1_59_0\boost/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=マイクラス
    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ブースト ヘッダーを使用する前に定義する必要があります。

#define BOOST_THREAD_USES_MOVE

詳細については、こちらを参照してください。Boost.Moveこの定義は、ここで必要な移動をエミュレートします。

Movable クラスを実装するために、パラメーターと戻り値の型を移動します。Boost.Thread は、コンパイラーがサポートしている場合、右辺値参照を使用します。これをサポートしていないコンパイラでは、Boost.Thread は、BOOST_THREAD_USES_MOVE が定義されているかどうかに応じて、Boost.Move によって提供されるエミュレーション、または Boost.Thread の以前のバージョンによって提供されるエミュレーションのいずれかを使用します。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.Move インターフェイスを使用する場合は BOOST_THREAD_USES_MOVE を定義します。BOOST_THREAD_VERSION==3 の場合、Boost.Move インターフェイスを使用したくない場合は BOOST_THREAD_DONT_USE_MOVE を定義します。

于 2015-09-05T20:06:56.683 に答える