2012-06-22 12 views
6

मेरे पास एमएसवीएस 2010 एसपी 1 के तहत एक परियोजना ठीक काम कर रही है। मैं इसे एमएसवीएस 2012 आरसी में बदलने की कोशिश कर रहा हूं। मुझे कुछ सामान बदलना पड़ा, मुख्य रूप से सी ++ हेडर/lib पथ और एमएफसी कस्टम सामान से संबंधित। लेकिन मुझे स्पष्ट करने के लिए एक आखिरी बाधा है।एमएसवीएस 2010 परियोजना को एमएसवीएस 2012 आरसी में कनवर्ट करना लेकिन त्रुटि प्राप्त करें "सी ++ मानक इस प्रकार के लिए हैश प्रदान नहीं करता है"

एमएसवीसी 2010 में, मैं unordered_map<basic_string<TCHAR>, int> या map<basic_string<TCHAR>, int> का उपयोग कर रहा हूं। यह ठीक संकलित करता है। लेकिन एमएसवीएस 2012 में, मुझे बस यह त्रुटि मिलती है: "सी ++ मानक इस प्रकार के लिए हैश प्रदान नहीं करता है"

नेट पर थोड़ी सी खोज करने के बाद, मुझे पता चला कि एमएसवीएस 2012 के करीब होना चाहिए सी ++ 11 मानक, और मानक केवल मूल प्रकारों और 4 परिभाषित स्ट्रिंग प्रकारों के लिए हैंश फ़ंक्शन को परिभाषित करता है (उनमें से string और wstring, लेकिन basic_string शामिल नहीं है)। इसलिए मैंने सभी basic_string<TCHAR> को wstring में बदल दिया लेकिन इसका कोई फायदा नहीं हुआ ... मुझे अभी भी वही त्रुटि मिलती है।

मुझे अपने ऐप को फिर से संकलित करने में सक्षम होने के लिए क्या करना चाहिए?

+0

शायद वीएस -2010 में आपके पास मल्टीबाइट अक्षम था इसलिए 'टीएचएआरएआर' को 'char' में मैप किया गया था और अब आपके पास मल्टीबाइट वर्ण सक्षम हैं ताकि' tCHAR' नक्शे 'wchar_t' पर सक्षम हो जाएं। प्रोजेक्ट गुणों में इन सेटिंग्स को बदलने का प्रयास करें। आपकी परियोजना सेटिंग्स के आधार पर – RedX

+1

'basic_string ' या तो 'std :: string' या' std :: wstring' (दोनों typedefs) है। सी ++ 11 में एकमात्र अंतर यह है कि स्ट्रिंग 'हैश <> 'अब' ' में है और '' नहीं है। –

+0

धन्यवाद बो, मुझे हर जगह शामिल करना था, जबकि इससे पहले मुझे इसे करने की आवश्यकता नहीं थी। मुझे जवाब देने से पहले 6 घंटे इंतजार करना होगा ... इस बीच, इसे स्वयं करने के लिए स्वतंत्र महसूस करें :) – OOEngineer

उत्तर

8

स्पष्ट रूप से OOEngineer का उपयोग <string> शीर्षलेख सहित किए बिना किया गया। कार्यक्षमता का हिस्सा वैसे भी दिखाई दे सकता है, अप्रत्यक्ष के माध्यम से अन्य शीर्षकों द्वारा शामिल किया जा सकता है।

जब वीएस -2010 जारी किया गया था, तब प्रस्तावित मानक <functional> शीर्षलेख में सभी std::hash<> विशेषज्ञता डाल दिया गया। अंतिम सी ++ 11 मानक में यह निर्णय लिया गया कि यह संबंधित कंटेनर के साथ एक साथ इन डाल करने के लिए बेहतर था, इसलिए कुछ hash<> विशेषज्ञताओं <string>, <vector> में ले जाया गया आदि

तो, इस्तेमाल किया करने के लिए सभी (या किसी भी , वास्तव में) std::string की कार्यक्षमता, आपको <string> हेडर स्वयं शामिल करना होगा और ऐसा करने पर किसी अन्य सिस्टम हेडर पर भरोसा नहीं करना चाहिए।