我正在将一些代码从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?
答案 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中很好地解释了这种疯狂。
因此,解决问题的一种方法是将两个_UNICODE
和UNICODE
预处理程序符号添加到gcc命令行。
但不要这样做!这是我对此事的看法 - 而不是依赖于模糊的宏,而只是手动将字符串文字加上L
。特别是在这种情况下,因为你说GetTag()
总是返回wstring const&
,所以我说使用_T()
宏来表示字符串文字是一个错误。
即便如此,在调用Windows API函数时,只需显式调用宽字符版本即可。例如,将GetWindowText
的来电替换为GetWindowTextW
。