以下代码段适用于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,它就可以工作。
提前谢谢。
答案 0 :(得分:2)
我认为这是一个错误,与MSVC 2010中移动语义的错误实现有关,因为您可以成功编译此代码:
typename Keys::value_type v( key, 1 );
keys_.insert(v);