2012-10-29 3 views
5

Ich versuche zu verstehen, wie boost :: locale verwendet wird, um Strings zu vergleichen, die Groß-/Kleinschreibung und Varianten ignorieren. Ich habe versucht, direkt einen Code von Boost-Dokumentation:Warum wird std :: bad_cast von boost :: locale geworfen?

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; 

Dieser Code ein std :: bad_cast Ausnahme auslösen wird beim Laufen. Ich habe viele Parameter im Konstruktor von boost :: locale :: generator ausprobiert. Weiß jemand über das Problem, auf das ich stoße?

Ich bin mit C++ 11 mit g ++ 4.6 und Boost 1.51.0

+0

Nur als Hinweis, die 'bad_cast' _exception_ signalisiert, dass die gegebene' locale' nicht die gewünschte 'Facette' hat. –

Antwort

4

Es scheint, dass Sie falsche locale verwenden object.You bei der ersten Verwendung globale Locale sollte und dann (wenn Sie möchten cout verwenden) verleihen Sie dem Stream das Gebietsschema. Somethig wie folgt aus:

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

Aber in Ihrem Beispiel, wenn Sie nicht gerade eingestellt globale Locale, um Sie verwenden cout erforderlich Facetten zu verwenden.

+1

Es gibt keine Notwendigkeit für 'std :: use_facet (l)', um eine spezifische globale 'std :: locale' zu ​​setzen! Es scheint eher, dass das Gebietsschema-Objekt nicht die erforderliche Facette enthält. –

+0

Ues scheint mein Locale nicht meine Collator Facette. Aber ich habe es mit einem Generator erstellt und ich erwartete, dass es einen enthält .. :( –

+0

Auch erfordert Textsegmentierung ICU, stellen Sie sicher, dass Sie Boost mit ICU-Unterstützung kompilieren, dies kann einfach über Homebrew wie folgt getan werden: 'brauen Install Boost - -with-icu4c --cxx11' und dann Kompilieren mit '-I/usr/local/include' und Verknüpfen mit' -L/usr/local/lib -lboost_locale-mt' – bithavoc

Verwandte Themen