VC6 - 如何使用用户定义的分面创建 std::locale
VC6 - How to create a std::locale with a user defined facet?
我尝试使用以下代码行创建一个语言环境:
std::locale loc(std::locale::classic(), new comma);
comma
的定义是:
struct comma : std::numpunct<char> {
char do_decimal_point() const { return ','; }
};
我认为它应该可以工作,因为我在 MSDN 文档中看到了类似的构造函数调用。不幸的是,我收到错误:
错误 C2664:"__thiscall std::locale::std::locale(const char *,int(":无法从"const char *"中的"const class std::locale"转换参数编号 1
你知道,我怎样才能把它做好吗?
在Stackoverflow上有一些答案,它们以这种方式(这个或这个(做对了。但似乎旧的 VC6 编译器不支持此构造函数(尽管 VC6 文档中的示例使用它(。但是必须有一种方法可以在VC6中使用分面,否则它不会成为文档的一部分。
要使用用户定义的分面创建 std::locale,我们可以使用 _ADDFAC
.在locale
构造函数的文档中,我发现了这个有用的提示:
[...]你应该写
_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
相关文章:
- 使用std::multimap迭代器创建std::list
- ";结果类型必须是可从输入范围的值类型""构造的;创建std::vector时
- C++如何创建 std::map
- 在共享缓冲区内存中创建 ::std::string 对象
- 创建 std::string 的二维数组的最佳做法
- 从 T 创建 std::future 的最佳方式<T>
- 是否可以从 std::any 创建 std::any 与 std::reference_wrapper?
- 从编译时已知的日历日期创建"std::chrono::time_point"
- 创建 std::函数,它返回具有函数成员值的变量.分段错误
- 如何从可变参数模板参数创建 std::tuple<>?
- 使用成员函数创建std::函数不会编译
- 通过预处理器创建 std::p air<std::string,some_enum>
- 创建 std::set 只复制一个元素,如何解决这个问题?
- 动态创建 std::vector 并将其传递给另一个函数的各种方法
- 编译问题 C++ 同时,尝试通过调用另一个对象中的成员函数来创建 std:: 线程
- 从函数应用程序创建 std::vector
- 创建 std::thread 时出现错误 C2280,未在 C++ 中初始化
- 使用std :: to_string()创建std :: String时的segfault
- 将C 数组写成文件,避免创建std :: String
- 稍后使用<Class>调用类构造函数创建 std::vector