2012-10-22 26 views
5

विजुअल स्टूडियो 2008 के साथ निम्नलिखित कोड का टुकड़ा काम लेकिन दृश्य स्टूडियो के साथ नहीं 2010.C++ VALUE_TYPE std :: tr1 के लिए काम नहीं: एक एसटीडी में टपल :: नक्शा

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

एक संकलक बग होने के लिए लगता है, यह [जीसीसी पर संकलित] (http : //liveworkspace.org/code/a21f9394d98fef376487a2e9ce1fc868)। आप 'Keys :: value_type' से पहले' टाइपनाम 'खो रहे हैं (चूंकि 'value_type'' TKey' पर निर्भर करता है); लेकिन जोड़ना कि त्रुटि को ठीक नहीं करता है। – Praetorian

+1

आमतौर पर, मैं 'keys_.insert (std :: make_pair (key, 1)) का उपयोग करता हूं;' ऐसे प्रविष्टियों के लिए। यह हमेशा काम करना चाहिए। –

+0

ओह, हाँ मैं टाइपनाम भूल गया। मैंने अपनी परियोजना में उपयोग की गई तीसरी पार्टी लाइब्रेरी से MyStruct निकाला। टाइपनाम है। तो मैं ऊपर नमूना तय करता हूँ। –

उत्तर

2

मुझे लगता है कि यह है कि MSVC 2010 में कदम अर्थ का बुरा कार्यान्वयन से संबंधित के बाद से आप सफलतापूर्वक इस कोड को संकलित कर सकते हैं एक त्रुटि है:

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

त्वरित प्रतिक्रियाओं के लिए धन्यवाद। MyStruct को बदलने के बिना कोड संकलित करने का कोई अन्य तरीका है। क्योंकि मैंने एक तृतीय-पक्ष लाइब्रेरी (पोको) से MyStruct निकाला है जिसे मैंने अपनी प्रोजेक्ट में उपयोग किया था। –