c ++ value_type不适用于std :: map中的std :: tr1:tuple

mar*_*.na 5 c++ templates tuples stdmap

以下代码段适用于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_;
};
Run Code Online (Sandbox Code Playgroud)

用法

typedef std::tr1::tuple<int, int> MyValueType;
MyStruct<MyValueType> a;
MyValueType x;
a.set(x);
Run Code Online (Sandbox Code Playgroud)

我收到以下错误:

1> C:\ Program Files\Microsoft Visual Studio 10.0\VC\include\tuple(127):错误C2440:'初始化':无法从'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,性病:: TR1 :: _无&,性病:: TR1 :: _无&,性病:: TR1 :: _无&,性病:: TR1 :: _无&,性病:: TR1 :: _无&度,标准:: tr1 :: _ Nil&,std :: tr1 :: _ Nil&,std :: tr1 :: _ Nil&,std :: tr1 :: _ Nil&>(_ Farg0 &&,_ Farg1,_Farg2,_Farg3,_Farg4,_Farg5,_Farg6,_Farg7,_Farg8 ,_Farg9)'正在编译1>,1> [1>
_Car = INT,1> _Cdr =标准:: TR1 :: _ Cons_node :: _类型>,1> _Ty = MyValueType,1> _Farg0 = MyValueType,1> _Farg1 =标准:: TR1 :: _无&,1>
_Farg2 = STD :: TR1 :: _无&,1> _Farg3 =标准:: TR1 :: _无&,1> _Farg4 =标准:: TR1 :: _无&,1> _Farg5 =标准:: TR1 :: _无&,1> _Farg6 =标准:: TR1 :: _无&,1> _Farg7 =标准:: TR1 :: _无&,1> _Farg8 =标准:: TR1 :: _无&,1> _Farg9 =标准:: TR1 :: _无&1> ] 1> C:\ Program Files\Microsoft Visual Studio 10.0\VC\include\utility(145):参见函数模板实例化'std :: tr1 :: tuple <_Arg0,_Arg1> :: tuple>(_ Farg0 &&) '正在编译1>
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(常量的std :: TR1 ::元组<_Arg0,_Arg1> &&,INT &&)" 1> 1>
[1> _Ty1 =常数MyValueType,1> _Ty2 = INT,1 > _Arg0 = INT,1> _Arg1 = INT 1> 1> C:\程序Files\Microsoft的Visual Studio 10.0\VC \包括\实用程序(174):见参考文献类模板实例"的std :: _ Pair_base <_Ty1,_Ty2 >'正在编译1> 1>
[1> _Ty1 = const MyValueType,1> _Ty2 = int 1>] 1>
d:\ Projekte \演示\ Demo.cpp(40):见参考文献类模板实例'的std ::对<_Ty1,_Ty2>'正在编译1> 1> [1>
_Ty1 =常数MyValueType,1> _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> [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 INT MyValueType取代的typedef的std :: TR1 ::元组MyValueType它的工作原理.

先感谢您.

Big*_*oss 2

我认为这是一个与 MSVC 2010 中移动语义的错误实现相关的错误,因为您可以成功编译此代码:

typename Keys::value_type v( key, 1 );
keys_.insert(v);
Run Code Online (Sandbox Code Playgroud)