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

时间:2012-10-22 16:12:11

标签: 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_;
};

用法

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

我收到以下错误:

  

1&gt; C:\ Program Files \ Microsoft Visual Studio 10.0 \ VC \ include \ tuple(127):   错误C2440:'初始化':无法从'const MyValueType'转换   'int'1&gt;没有可用的用户定义转换运算符   可以执行此转换,或者不能调用运算符1>   C:\ Program Files \ Microsoft Visual Studio 10.0 \ VC \ include \ xxtuple0(9):   请参阅函数模板实例化的参考   “的std :: TR1 :: _ Cons_node&LT; _Car,_Cdr&GT; :: _ Cons_node&LT; _Ty,性病:: TR1 :: _无&安培;,的std :: TR1 :: _无&安培;,的std :: TR1 :: _无&安培;,的std :: TR1 :: _无&安培;,的std :: TR1 :: _无&安培;,的std :: TR1 :: _无&安培;,的std :: TR1 :: _无&安培;,的std :: TR1 :: _无&安培;,的std :: TR1 :: _无&安培;&GT (_ Farg0   &安培;&安培;,_ Farg1,_Farg2,_Farg3,_Farg4,_Farg5,_Farg6,_Farg7,_Farg8,_Farg9)”   正在编译1&gt;用1> [1>   _Car = int,1&gt; _Cdr =标准:: TR1 :: _ Cons_node :: _类型&gt;中   1 GT; _Ty = MyValueType,1&gt; _Farg0 = MyValueType,   1 GT; _Farg1 = std :: tr1 :: _ Nil&amp;,1&gt;
  _Farg2 = std :: tr1 :: _ Nil&amp;,1&gt; _Farg3 = std :: tr1 :: _ Nil&amp;,1&gt; _Farg4 = std :: tr1 :: _ Nil&amp;,1&gt; _Farg5 = std :: tr1 :: _ Nil&amp;,1&gt; _Farg6 = std :: tr1 :: _ Nil&amp;,1&gt; _Farg7 = std :: tr1 :: _ Nil&amp;,1&gt; _Farg8 = std :: tr1 :: _ Nil&amp;,1&gt; _Farg9 = std :: tr1 :: _ Nil&amp; 1 GT; ] 1&gt; C:\ Program Files \ Microsoft Visual Studio   10.0 \ VC \ include \ utility(145):参见函数模板实例化'std :: tr1 :: tuple&lt; _Arg0,_Arg1&gt; :: tuple&gt;(_ Farg0&amp;&amp;)'正在编译1&gt;
  用1> [1> _Arg0 = int,1&gt;
  _Arg1 = int,1&gt; _Farg0 = const std :: tr1 :: tuple 1&gt; ] 1&gt; C:\ Program Files \ Microsoft Visual Studio   10.0 \ VC \ include \ utility(142):编译类模板成员函数'std :: _ Pair_base&lt; _Ty1,_Ty2&gt; :: _ Pair_base(const)   的std :: TR1 ::元组&LT; _Arg0,_Arg1&GT; &amp;&amp;,int&amp;&amp;)'1&gt; 1 >>   [1> _Ty1 = const MyValueType,1&gt; _Ty2 = int,1&gt;   _Arg0 = int,1&gt; _Arg1 = int 1&gt; ] 1&gt; C:\ Program Files \ Microsoft Visual Studio 10.0 \ VC \ include \ utility(174)   :请参阅类模板实例化的引用   '的std :: _ Pair_base&LT; _Ty1,_Ty2&GT;'正在编译1&gt; 1 >>   [1> _Ty1 = const MyValueType,1&gt; _Ty2 = int 1&gt;   ] 1&gt;
  d:\ Projekte \演示\ Demo.cpp(40)   :请参阅类模板实例化'std :: pair&lt; _Ty1,_Ty2&gt;'   正在编译1&gt;用1> [1>   _Ty1 = const MyValueType,1&gt; _Ty2 = int 1&gt; ] 1&gt; d:\ Projekte \演示\ Demo.cpp(39)   :编译类模板成员函数时'void   MyStruct :: set(TKey&amp;)'1&gt;用1> [1>   TKey = MyValueType 1&gt; ] 1&gt;
  d:\ Projekte \演示\ Demo.cpp(92)   :请参阅类模板实例化'MyStruct'的引用   编译1&gt;用1> [1>   TKey = MyValueType 1&gt; ] 1&gt; C:\ Program Files \ Microsoft Visual   Studio 10.0 \ VC \ include \ tuple(127):错误C2439:   'std :: tr1 :: _ Cons_node&lt; _Car,_Cdr&gt; :: _ Value':成员不能   初始化1>用1> [1> _Car = INT,   1 GT;
  _Cdr =标准:: TR1 :: _ Cons_node :: _类型&GT;   1 GT; ] 1&gt; C:\ Program Files \ Microsoft Visual Studio   10.0 \ VC \ include \ tuple(170):参见'std :: tr1 :: _ Cons_node&lt; _Car,_Cdr&gt; :: _ Value'1&gt;的声明1 >>   [1> _Car = int,1&gt;
  _Cdr =标准:: TR1 :: _ Cons_node :: _类型&GT;   1 GT; ]   ==========构建:0成功,1个失败,0个最新,0个跳过==========

如果使用typedef int MyValueType替换typedef std :: tr1 :: tuple MyValueType,它就可以工作。

提前谢谢。

1 个答案:

答案 0 :(得分:2)

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

typename Keys::value_type v( key, 1 );
keys_.insert(v);