5

次のコード スニペットは、Visual Studio 2008 では機能しますが、Visual Studio 2010 では機能しません。

template <typename TKey>
struct MyStruct
{
    typedef std::map<TKey, int>  Keys;

    MyStruct()
    {
    }

    void set(TKey& key)
    {
#if 1
        // This works with VS 2008 but not with 2010
        keys_.insert(typename Keys::value_type(key, 1));
#else
        // This works with VS 2008 and VS 2010
        keys_.insert(std::pair<TKey, int>(key, 1));
#endif
    };

private:
    Keys keys_;
};

使用法

typedef std::tr1::tuple<int, int> MyValueType;
MyStruct<MyValueType> a;
MyValueType x;
a.set(x);

次のエラーが表示されます。

1>C:\Program Files\Microsoft Visual Studio 10.0\VC\include\tuple(127): エラー C2440: 'initializing': 'const MyValueType' から 'int' に変換できません 1> ユーザー定義の変換演算子がありません1> C:\Program Files\Microsoft Visual Studio 10.0\VC\include\xxtuple0(9) : 関数テンプレートのインスタンス化 'std::tr1::_Cons_node<_Car への参照を参照してください,_Cdr>::_Cons_node<_Ty,std::tr1::_Nil&,std::tr1::_Nil&,std::tr1::_Nil&,std::tr1::_Nil&,std::tr1::_Nil&,std ::tr1::_Nil&,std::tr1::_Nil&,std::tr1::_Nil&,std::tr1::_Nil&>(_Farg0 &&,_Farg1,_Farg2,_Farg3,_Farg4,_Farg5,_Farg6,_Farg7,_Farg8 ,_Farg9)' が 1> [ 1> でコンパイルされている
_Car=int, 1> _Cdr=std::tr1::_Cons_node::_Type>, 1> _Ty=MyValueType, 1> _Farg0=MyValueType, 1> _Farg1=std::tr1::_Nil &, 1>
_Farg2=std ::tr1::_Nil &, 1> _Farg3=std::tr1::_Nil &, 1> _Farg4=std::tr1::_Nil &, 1> _Farg5=std::tr1::_Nil &, 1> _Farg6 =std::tr1::_Nil &, 1> _Farg7=std::tr1::_Nil &, 1> _Farg8=std::tr1::_Nil &, 1> _Farg9=std::tr1::_Nil & 1> ] 1> C:\Program Files\Microsoft Visual Studio 10.0\VC\include\utility(145) : 関数テンプレートのインスタンス化への参照を参照してください 'std::tr1::tuple<_Arg0,_Arg1>::tuple>(_Farg0 &&) ' コンパイル中 1>
with 1> [ 1> _Arg0=int, 1>
_Arg1=int, 1> _Farg0=const std::tr1::tuple 1> ] 1> C:\Program Files\Microsoft Visual Studio 10.0\VC\include\utility(142) : クラス テンプレート メンバー関数 'std のコンパイル中: :_Pair_base<_Ty1,_Ty2>::_Pair_base(const std::tr1::tuple<_Arg0,_Arg1> &&,int &&)' 1> with 1>
[ 1> _Ty1=const MyValueType, 1> _Ty2=int, 1 > _Arg0=int, 1> _Arg1=int 1> ] 1> C:\Program Files\Microsoft Visual Studio 10.0\VC\include\utility(174) : クラス テンプレートのインスタンス化への参照を参照してください 'std::_Pair_base<_Ty1,_Ty2 >' コンパイル中 1> 1>
[ 1> _Ty1=const MyValueType, 1> _Ty2=int 1> ] 1>
D:\Projekte\demo\Demo.cpp(40) : 1> [ 1>
_Ty1=const MyValueType, 1> _Ty2=でコンパイルされているクラス テンプレートのインスタンス化 'std::pair<_Ty1,_Ty2>' への参照を参照してくださいint 1> ] 1> D:\Projekte\demo\Demo.cpp(39) : クラス テンプレート メンバ関数 'void MyStruct::set(TKey &)' をコンパイル中 1> with 1> [ 1>
TKey=MyValueType 1> ] 1>
D:\Projekte\demo\Demo.cpp(92) : クラス テンプレートのインスタンス化 'MyStruct' が 1> でコンパイルされている参照を参照してください 1> [ 1>
TKey=MyValueType 1> ] 1>C:\Program Files\Microsoft Visual Studio 10.0\VC\include\tuple(127): エラー C2439: 'std::tr1::_Cons_node<_Car,_Cdr>::_Value': メンバー初期化できませんでした 1> [ 1> _Car=int, 1>
_Cdr=std::tr1::_Cons_node::_Type> 1> ] 1> C:\Program Files\Microsoft Visual Studio 10.0\VC\include \tuple(170) : 'std::tr1::_Cons_node<_Car,_Cdr>::_Value' 1> の宣言を参照 1>
[ 1> _Car=int, 1>
_Cdr=std::tr1::_Cons_node: :_Type> 1> ] ========== ビルド: 0 成功、1 失敗、0 最新、0 スキップ ==========

typedef std::tr1::tuple MyValueType を typedef int MyValueType に置き換えると、機能します。

前もって感謝します。

4

1 に答える 1

2

このコードを正常にコンパイルできるため、これは MSVC 2010 での移動セマンティックの不適切な実装に関連するエラーだと思います。

typename Keys::value_type v( key, 1 );
keys_.insert(v);
于 2012-10-22T16:39:25.483 に答える