【问题标题】:VC6 - How to create a std::locale with a user defined facet?VC6 - 如何使用用户定义的方面创建 std::locale?
【发布时间】:2013-11-20 12:55:12
【问题描述】:

我尝试使用以下代码行创建语言环境:

std::locale loc(std::locale::classic(), new comma);

comma的定义是:

struct comma : std::numpunct<char> {
    char do_decimal_point() const { return ','; }
};

我认为它应该可以工作,因为我在 MSDN 文档中看到了对 facet 的类似构造函数调用。不幸的是,我得到了错误:

错误 C2664: '__thiscall std::locale::std::locale(const char *,int)' : 无法从 'const char *' 中的 'const class std::locale' 转换参数号 1

你知道,我怎样才能做到正确吗?

在 Stackoverflow 上有一些答案,它们就是这样做的(thisthis one)。但似乎旧的 VC6 编译器不支持此构造函数(尽管 VC6 文档中的示例使用了它)。但是必须有一种方法可以在 VC6 中使用构面,否则它不会成为文档的一部分。

【问题讨论】:

  • 您对 VC6 持非常的乐观态度。我很惊讶仍然有 MSDN 文档,但它肯定不再受支持。 IE。如果文档有误,微软不会修复它。
  • @MSalters:我对参与 stackoverflow.com 的人持乐观态度,更多时候我没有得到有用的答案,但不幸的是,没有人愿意深入研究 VC6 部分。
  • 嗯,与希望看到 VC6 回归的人相比,致力于复兴渡渡鸟的人更多。

标签: c++ visual-c++-6


【解决方案1】:

要创建具有用户定义方面的 std::locale,我们可以使用_ADDFAC。在documentation to the locale constructor 我发现了这个有用的提示:

[...] 你应该写 _ADDFAC(loc, Facet) 来返回一个新的 locale ,它将构面 Facet 添加到语言环境 loc,因为目前并非所有翻译器都支持额外的模板构造函数

VC6 似乎不支持额外的模板构造函数。

示例代码:

std::istringstream iss("333,444"); // comma is decimal mark
std::locale loc(std::_ADDFAC(iss.getloc(), new comma));
iss.imbue(loc);
iss >> e;
std::cout << e << std::endl; // prints 333.444

【讨论】:

  • 该编译器的最佳来源仍然是 1998 年或 1999 年的独立 MSDN 安装(您无法在 win 7 64 位上安装 :( )。多年来对 MSDN 文档的编辑重写了过去因为 VC6 的工作方式类似于后来出现的慢速编译器。使用 VC6 编写 STL 很费力,因为有许多部分实现。
  • 你说得对,我机器上的 VC6 在虚拟 32 位 XP 环境中运行。我需要它用于一些旧的大型项目,在这些项目中很难将它们移植到新的 IDE 中。缺点是,在将 STL 与 VC6 一起使用时,我总是必须小心。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-02-14
  • 2011-06-04
  • 2011-02-21
  • 2013-09-26
  • 1970-01-01
  • 2014-02-01
  • 2017-09-15
相关资源
最近更新 更多