【问题标题】:Why is std::bad_cast thrown by boost::locale?为什么 boost::locale 会抛出 std::bad_cast?
【发布时间】:2012-10-19 06:47:19
【问题描述】:

我试图了解如何使用 boost::locale 来比较忽略大小写和变体的字符串。我直接尝试了 Boost 文档中的代码:

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;

这段代码在运行时会抛出一个 std::bad_cast 异常。 我在 boost::locale::generator 的构造函数中尝试了很多参数。有人知道我遇到的问题吗?

我正在使用带有 g++4.6 和 Boost 1.51.0 的 C++11

【问题讨论】:

  • 作为一个提示,bad_cast exception 表示给定的locale 没有请求的facet。

标签: c++ exception boost locale


【解决方案1】:

您似乎使用了不正确的语言环境对象。首先,您应该使用全局语言环境,然后(如果您想使用std::cout)将语言环境灌输到流中。像这样的:

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

但是,在您的示例中,如果您不使用 std::cout,只需设置全局区域设置,以便您准备好所需的方面。

【讨论】:

  • std::use_facet&lt;F&gt;(l) 不需要设置特定的全局std::locale!似乎 locale 对象不包含所需的方面。
  • 看来我的语言环境没有我的整理人方面。但我用生成器创建了它,我希望它包含一个.. :(
  • 另外,文本分割需要 ICU,请确保您在 ICU 支持下编译 boost,这可以通过 homebrew 轻松完成,如下所示:brew install boost --with-icu4c --cxx11 然后使用 -I/usr/local/include 编译并与 -L/usr/local/lib -lboost_locale-mt 链接
猜你喜欢
  • 2023-03-28
  • 1970-01-01
  • 2011-04-06
  • 1970-01-01
  • 2013-07-11
  • 2020-07-17
  • 2015-10-29
  • 2020-08-05
  • 2013-10-12
相关资源
最近更新 更多