将 std::wstring 从 visual studio 移植到 mingw gcc

porting std::wstring from visual studio to mingw gcc

我正在将一些代码从 Visual studio 移植到 mingw gcc。 我遇到了这个声明

if ( mnode.GetTag() == _T( "val" ) )    
        return  true;

这是GetTag()方法的定义

const std::wstring &GetTag() const;

我遇到错误

error: no matching function for call to 'std::basic_string<wchar_t>::basic_string(const char [6])'|

现在阅读 this 我仍然不确定如何解决这个问题。 关于为什么会出现此错误的任何建议?是因为 wstring 吗?

您的问题似乎是 _UNICODE 预处理器宏未定义。 MSDN explains 这如何影响包含在 _T() 宏中的字符串文字。

 pWnd->SetWindowText( _T("Hello") );

With _UNICODE defined, _T translates the literal string to the L-prefixed form; otherwise, _T translates the string without the L prefix.

向字符串文字添加 L 前缀表示它是 wide string literal,并且 std::wstring(或 std::basic_string<wchar_t>)定义了 operator== 重载采用 wchar_t const * 参数,从而允许您的代码编译。

请注意,如果您要调用 Windows API 中的函数,还有一个相关的 UNICODE 宏。雷蒙德·陈 (Raymond Chen) 在 this post.

中很好地解释了这种疯狂

因此,解决问题的一种方法是将 _UNICODEUNICODE 预处理器符号添加到 gcc 命令行。

但是不要这样做!这是我对此事的看法——与其依赖晦涩的宏,不如手动在字符串文字前加上 L 前缀。特别是在这种情况下,既然你说 GetTag() 总是 returns 一个 wstring const&,我会说对那个字符串文字使用 _T() 宏是一个错误。

否则,在调用Windows API 函数时,直接调用宽字符版本即可。例如,将对 GetWindowText 的调用替换为 GetWindowTextW.