gpt4 book ai didi

c++ - 将 CStringW 插入 std::wostringstream 时出现问题

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:30:25 26 4
gpt4 key购买 nike

我正在将 MFC 程序从 MBCS 转换为 Unicode。我发现插入运算符 << 与 CStringA 实例的工作方式与 CStringW 实例不同。

// char
std::ostringstream c_oss;
CStringA c_s("Hello");
c_oss << c_s;
TRACE("%s\n", c_oss.str().c_str());

// wchar_t
std::wostringstream w_oss;
CStringW w_s(L"World");
w_oss << w_s;
TRACE(L"%s\n", w_oss.str().c_str());

我希望这会打印“Hello\nWorld\n”,但它会打印“Hello\n14,5E6,B38\n”。也就是说,它打印的是 w_s 数据的地址,而不是数据。

如果我调试 w_oss << w_s,我可以看到选择了用于插入 const void* 的重载,而不是用于插入 const wchar_t* 的重载。它对 char 版本工作正常。如果我明确应用大小写 (LPCTSTR) 或 (const wchar_t*),它对 wchar_t 版本可以正常工作。

知道为什么 wchar_t 版本与 char 版本的工作方式不同吗?

最佳答案

operator<< 的宽字符版本是一个模板,因此需要精确的参数匹配。没有用户定义的转换,例如 CStringW::operator wchar_t*()隐式执行。

OTOH void*同一运算符的版本不是模板,并愉快地使用用户定义的转换运算符。

关于c++ - 将 CStringW 插入 std::wostringstream 时出现问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12900593/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com