私の環境は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"
。これを削除すると、コードがコンパイルされます。回避策としてできることはありますか?