2012-10-29 9 views
5

मैं समझने के लिए मामला और वेरिएंट अनदेखी तार तुलना करने के लिए बढ़ावा :: लोकेल उपयोग करने के लिए प्रयास करें। मैं सीधे बूस्ट प्रलेखन से एक कोड की कोशिश की:क्यों std :: bad_cast boost :: locale द्वारा फेंक दिया गया है?

http://www.boost.org/doc/libs/1_51_0/libs/locale/doc/html/collation.html

boost::locale::generator gen; 
std::locale vLocale = gen(""); 


std::wstring a=L"Façade", b=L"facade"; 

// Following will throw bad_cast 
bool eq = std::use_facet<boost::locale::collator<wchar_t>>(vLocale).compare(
    boost::locale::collator_base::secondary, 
    a, 
    b 
) == 0; 

if(eq) std::cout << "OK" << std::endl; 

इस कोड को एक एसटीडी फेंक होगा :: bad_cast अपवाद है जब चल रहा है। मैं बढ़ावा :: स्थान :: जनरेटर के निर्माता में मानकों का एक बहुत कोशिश की। क्या मुझे किसी समस्या का सामना करना पड़ता है?

मैं सी ++ 11 उपयोग कर रहा हूँ जी के साथ ++ 4.6 और 1.51.0

+0

बस एक संकेत के रूप में, 'bad_cast' _exception_ संकेत दे रहा है कि दिया गया' लोकेल 'अनुरोधित' पहलू 'नहीं है। –

उत्तर

4

बूस्ट यह आप गलत स्थान object.You पहला प्रयोग वैश्विक वातावरण में होना चाहिए और उसके बाद (प्रयोग कर रहे हैं लगता है कि आप अदालत उपयोग करना चाहते हैं) धारा के लिए लोकेल imbue। Somethig इस तरह:

boost::locale::generator gen; 
std::locale loc = gen(""); 
std::locale::global(loc); 

लेकिन अपने उदाहरण में यदि आप क्रम में आप का उपयोग करने के पहलुओं की आवश्यकता है वैश्विक वातावरण सिर्फ सेट अदालत का उपयोग नहीं कर रहे हैं।

+1

'std :: use_facet (l) 'के लिए कोई विशिष्ट वैश्विक' std :: locale' सेट करने की आवश्यकता नहीं है! ऐसा लगता है कि लोकेल ऑब्जेक्ट में आवश्यक पहलू नहीं है। –

+0

उस ऐसा लगता है कि मेरे लोकेल में मेरे कॉललेटर पहलू नहीं हैं। लेकिन मैंने इसे जनरेटर के साथ बनाया और मुझे उम्मीद थी कि इसमें एक शामिल होगा .. :( –

+0

इसके अलावा, टेक्स्ट सेगमेंटेशन को आईसीयू की आवश्यकता होती है, सुनिश्चित करें कि आप आईसीयू समर्थन के साथ बढ़ावा संकलित करते हैं, इसे आसानी से होमब्री के माध्यम से किया जा सकता है: 'ब्रूव इंस्टॉल बूस्ट - -with-icu4c - cxx11' और फिर '-I/usr/local/include' के साथ संकलित और '-L/usr/local/lib -lboost_locale-mt' से लिंक करना – bithavoc