2012-07-10 24 views
8

के लिए कुंजी के रूप में std :: tuple का उपयोग करना नीचे दिए गए कोड के साथ, मुझे एमएसवीसी में एक बहुत भ्रमित त्रुटि मिलती है जो कि मुख्य प्रकार (एक std :: tuple) को एक std में परिवर्तित किया जा रहा है: : स्ट्रिंग।std :: unordered_map

#include <iostream> 
#include <string> 
#include <tuple> 
#include <utility> 
#include <unordered_map> 

typedef std::tuple<std::string,int,char> key_t; 

struct key_hash : public std::unary_function<key_t, std::size_t> 
{ 
    std::size_t operator()(const key_t& k) const 
    { 
     return std::get<0>(k)[0]^std::get<1>(k)^std::get<2>(k); 
    } 
}; 

struct key_equal : public std::binary_function<key_t, key_t, bool> 
{ 
    bool operator()(const key_t& v0, const key_t& v1) const 
    { 
     return (
       std::get<0>(v0) == std::get<0>(v1) && 
       std::get<1>(v0) == std::get<1>(v1) && 
       std::get<2>(v0) == std::get<2>(v1) 
      ); 
    } 
}; 

struct data 
{ 
    std::string x; 
}; 

typedef std::unordered_map<key_t,data,key_hash,key_equal> map_t; 


int main() 
{ 
    map_t m; 
    data d; 
    d.x = "test data"; 
    m[std::make_tuple("abc",1,'X')] = d; 
    auto itr = m.find(std::make_tuple(std::string("abc"),1,'X')); 
    if (m.end() != itr) 
    { 
     std::cout << "x: " << itr->second.x; 
    } 
    return 0; 
} 

त्रुटि:

Error 1 error C2664: 'std::basic_string<_Elem,_Traits,_Ax>::basic_string(const std::basic_string<_Elem,_Traits,_Ax> &)' : cannot convert parameter 1 from 'const std::tr1::tuple<_Arg0,_Arg1,_Arg2>' to 'const std::basic_string<_Elem,_Traits,_Ax> &' c:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\include\tuple 127 1 

संकलक: एमएस दृश्य स्टूडियो 2010

ideone पर, मैं और भी अधिक जटिल त्रुटि निम्नलिखित हो:

http://ideone.com/yEv2j

मैं कर सकते हैं ' मुझे लगता है कि मैं गलत कहां गया हूं।

+0

ध्यान दें कि आप की तरह 'कुंजी तुलना करने के लिए की जरूरत नहीं है std :: मिल <0> (V0) == std :: मिल <0> (v1) && .....' इसके बजाय आप बस लिख सकते हैं 'वापसी V0 = = v1'। – Nawaz

+0

@ नवाज: टिप्पणी के लिए धन्यवाद, मैंने कोशिश की लेकिन मुझे अभी भी त्रुटि मिल रही है। – Gerdiner

+0

कौन सी रेखा त्रुटि उत्पन्न कर रही है, पहले मेक_टूपल या दूसरा वाला है? विचार एक त्रुटि key_t को परिभाषित किया जा रहा है। प्रकार का नाम बदलने का प्रयास करें। – Ajay

उत्तर

2

अजीब। आपका कोड विजुअल स्टूडियो 2012 आरसी में ठीक काम करता है और आउटपुट "एक्स: टेस्ट डेटा" है।

+0

स्पष्ट होना चाहिए था, मैं एमएस विजुअल स्टूडियो 2010 का उपयोग कर रहा हूं। – Gerdiner

+0

आदर्श त्रुटि पर /usr/include/sys/types.h:123:17: त्रुटि: 'key_t' की पिछली घोषणा 'typedef __key_t key_t' है ', तो यह एक और टाइपपीफ के साथ काम करेगा, लेकिन मुझे 2012 वीसी के बारे में पता नहीं है। – ForEveR

+0

आप सही हैं, मैं इस प्रकार का नाम बदलता हूं और यह विचारधारा के साथ संकलित होता है, ऐसा लगता है कि एमएसवीसी में एक बग हो सकता है: http://ideone.com/olN9W – Gerdiner

4

ideone के लिए समस्या यह है कि key_t पहले से मौजूद है:

prog.cpp:7:42: error: conflicting declaration 'typedef class std::tuple<std::basic_string<char>, int, char> key_t' 
/usr/include/sys/types.h:123:17: error: 'key_t' has a previous declaration as 'typedef __key_t key_t' 

का नाम बदलें अपने key_t कुछ और करने के लिए है, या यह कुछ नामस्थान में डाल दिया।

Your code works after this change दोनों g ++ और clang ++ में। मेरा मानना ​​है कि यह एमएसवीसी में एक बग है।

संबंधित मुद्दे