将Visual Studio中的std :: wstring移植到mingw gcc

时间:2015-02-20 22:10:50

标签: c++ visual-studio gcc mingw-w64

我正在将一些代码从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?

1 个答案:

答案 0 :(得分:5)

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

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

定义_UNICODE后,_T会将文字字符串转换为L - 前缀格式;否则,_T会转换不带L前缀的字符串。

在字符串文字中添加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()总是返回wstring const&,所以我说使用_T()宏来表示字符串文字是一个错误。

即便如此,在调用Windows API函数时,只需显式调用宽字符版本即可。例如,将GetWindowText的来电替换为GetWindowTextW