Visual Studio Enterprise 2010、sp1、Windows764ビット。1.48.0をブーストします。
ここから関連するコードを開始します。これらのビットはヘッダーで定義されます。
//typedef struct {} empty_t;
//typedef std::pair<size_t, std::shared_ptr<char>> string_t; //Don't ask...
//typedef boost::variant<empty_t, long, double, some other PODs, string_t> variant_t;
//typedef std::map<unsigned short, variant_t> variant_map_t;
これは、コピーコンストラクターの本体にあります。
std::for_each(std::begin(incoming.values_), std::end(incoming.values_), [&](variant_map_t::value_type value)
{
// This guy is going to populate this::values_, doing the right thing -
// copying by value native and POD types, or deep copying pointers.
boost::apply_visitor(deep_copy_visitor(*this, value.first), value.second);
});
私が見つけたエラーは、ラムダのパラメーターリストにあります。スワップが呼び出されていると思いますが、ペアのコピーコンストラクターでは、最初にラムダに渡された右辺値からパラメーターに割り当てようとしています。コンパイラーは、「value.first」がstd :: pairコピーコンストラクターで割り当てられている場合、それがconstであると見なします。しかし、明らかに、パラメーターはconst修飾されておらず、mapped_typeまたはkey_typeはconst修飾されておらず、コピーコンストラクターはconstメソッドではなく、いずれも重要ではありません。
C:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\include\utility(209) : see reference to function template instantiation 'void std::_Swap_adl<_Ty1>(_Ty &,_Ty &)' being compiled
with
[
_Ty1=unsigned short,
_Ty=unsigned short
]
C:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\include\utility(206) : while compiling class template member function 'void std::pair<_Ty1,_Ty2>::swap(std::pair<_Ty1,_Ty2> &)'
with
[
_Ty1=const unsigned short,
_Ty2=variant_t
]
src\foo.cpp(506) : see reference to class template instantiation 'std::pair<_Ty1,_Ty2>' being compiled
with
[
_Ty1=const unsigned short,
_Ty2=variant_t
]
どういうわけか、テンプレートパラメータはconst修飾されており、私の一生の間、その理由を理解することはできません。
何か他のものがコンパイラーを作動させていると思いますが、私は他に何もすることがありません。以前、ソースコードをよくかき混ぜて、これを理解しようとする前に、このエラーメッセージのオンとオフを切り替えることができました。boost::static_visitor派生クラスを定義しました。メンバーもメソッドも何もありません。これで、ここのコピーコンストラクターでこのエラーが発生しました。実際に問題のあるコード行を分離する方法を他に想像することはできません...
誰かがこれがコンパイラの問題であり、言及されていない変更がこれを副作用として持っていると思いますか?