C++ 将std::wstring从visual studio移植到mingw gcc
我正在将一些代码从VisualStudio移植到MingWGCC。 我偶然发现了这句话C++ 将std::wstring从visual studio移植到mingw gcc,c++,visual-studio,gcc,mingw-w64,C++,Visual Studio,Gcc,Mingw W64,我正在将一些代码从VisualStudio移植到MingWGCC。 我偶然发现了这句话 if ( mnode.GetTag() == _T( "val" ) ) return true; 这是GetTag()方法的定义 我发现了错误 error: no matching function for call to 'std::basic_string<wchar_t>::basic_string(const char [6])'| 错误:调用'std::b
if ( mnode.GetTag() == _T( "val" ) )
return true;
这是GetTag()方法的定义
我发现了错误
error: no matching function for call to 'std::basic_string<wchar_t>::basic_string(const char [6])'|
错误:调用'std::basic_string::basic_string(const char[6])时没有匹配的函数|
现在读完后,我仍然不知道如何解决这个问题。
关于出现此错误的原因有何建议?是因为wstring吗?您的问题似乎是未定义
\u UNICODE
预处理器宏。这如何影响\u T()
宏中包含的字符串文字
定义了\u UNICODE
后,\u T
将文本字符串转换为前缀形式L
;否则,\u T
将翻译不带L
前缀的字符串
将L
前缀添加到字符串文字表示它是一个字符串,而std::wstring
(或std::basic_string
)定义了一个运算符==
重载,该重载采用wchar___const*
参数,从而允许您的代码进行编译
请注意,如果要在Windows API中调用函数,还有一个与之相关的UNICODE
宏。雷蒙德·陈在书中很好地解释了这种疯狂
因此,解决问题的一种方法是向gcc命令行添加\u UNICODE
和UNICODE
预处理器符号
但不要这样做!这是我对这一问题的看法——与其依赖于晦涩难懂的宏,不如手动在字符串文本前面加上L
。特别是在这种情况下,因为您说GetTag()
总是返回一个wstring常量&
,所以我认为对该字符串文本使用\u T()
宏是一个错误
否则,在调用Windows API函数时,只需显式调用宽字符版本。例如,将对
GetWindowText
的调用替换为GetWindowTextW
使用MinGW构建时定义的\u T()
宏是什么?听起来好像没有定义UNICODE。请参阅:@JamesFranco,T变体根据定义的预处理器值使用窄字符串或宽字符串。它们已经过时了。明确使用窄字符串或宽字符串。当与Windows API接口时,更喜欢使用宽版本。@JamesFranco\uu T()
只是另一个宏,如果一直跟踪它,你会看到它扩展为L
,或者什么都没有,这取决于是否定义了UNICODE
(或者\uUnicode
)预处理器符号。听起来好像您没有定义它,在这种情况下,看起来您复制粘贴了错误的错误语句。与您显示的代码行相对应的代码应该是const char[4]
,而不是const char[6]
,这增加了不适。实际上有两组宏和限定符UNICODE
和\u UNICODE
,以及TEXT()
和\u T()
。一组是通过Windows API提供的,另一组是通过MSVC运行时提供的。是啊,多有趣啊。
error: no matching function for call to 'std::basic_string<wchar_t>::basic_string(const char [6])'|
pWnd->SetWindowText( _T("Hello") );