2012-10-22 91 views
5

與Visual Studio 2008下面的代碼片段工作,但不與Visual Studio 2010中C++ VALUE_TYPE不是的std :: TR1工作:元組一個std ::地圖

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): error C2440: 'initializing' : cannot convert from 'const MyValueType' to 'int' 1> No user-defined-conversion operator available that can perform this conversion, or the operator cannot be called 1> C:\Program Files\Microsoft Visual Studio 10.0\VC\include\xxtuple0(9) : see reference to function template instantiation '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)' being compiled 1> with 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) : see reference to function template instantiation 'std::tr1::tuple<_Arg0,_Arg1>::tuple>(_Farg0 &&)' being compiled 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) : while compiling class template member function '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) : see reference to class template instantiation 'std::_Pair_base<_Ty1,_Ty2>' being compiled 1> with 1>
[ 1> _Ty1=const MyValueType, 1> _Ty2=int 1> ] 1>
D:\Projekte\demo\Demo.cpp(40) : see reference to class template instantiation 'std::pair<_Ty1,_Ty2>' being compiled 1> with 1> [ 1>
_Ty1=const MyValueType, 1> _Ty2=int 1> ] 1> D:\Projekte\demo\Demo.cpp(39) : while compiling class template member function 'void MyStruct::set(TKey &)' 1> with 1> [ 1>
TKey=MyValueType 1> ] 1>
D:\Projekte\demo\Demo.cpp(92) : see reference to class template instantiation 'MyStruct' being compiled 1> with 1> [ 1>
TKey=MyValueType 1> ] 1>C:\Program Files\Microsoft Visual Studio 10.0\VC\include\tuple(127): error C2439: 'std::tr1::_Cons_node<_Car,_Cdr>::_Value' : member could not be initialized 1> with 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) : see declaration of 'std::tr1::_Cons_node<_Car,_Cdr>::_Value' 1> with 1>
[ 1> _Car=int, 1>
_Cdr=std::tr1::_Cons_node::_Type> 1> ] ========== Build: 0 succeeded, 1 failed, 0 up-to-date, 0 skipped ==========

如果更換的typedef的std :: TR1 ::元組的typedef INT MyValueType MyValueType它的工作原理。

預先感謝您。

+2

似乎是一個編譯器缺陷,它[在GCC編譯](HTTP ://liveworkspace.org/code/a21f9394d98fef376487a2e9ce1fc868)。你在'Keys :: value_type'之前缺少'typename'(因爲'value_type'依賴於'TKey');但補充說明也不能解決錯誤。 – Praetorian

+1

通常,我使用'keys_.insert(std :: make_pair(key,1));'來表示這樣的插入。這應該始終有效。 –

+0

哦,是的,我忘記了typename。我從我的項目中使用的第三方庫中提取了MyStruct。有類型名稱。所以我修正了上面的示例。 –

回答

2

我想這是因爲你可以成功編譯這段代碼中涉及到壞的實施,2010年MSVC移動語義的錯誤:

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

感謝您的快速回復。 有沒有其他的方式來編譯代碼而不改變MyStruct。 因爲我從我的項目中使用的第三方庫(Poco)中提取了MyStruct。 –

相關問題