Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/164.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/kubernetes/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 将std::wstring从visual studio移植到mingw gcc_C++_Visual Studio_Gcc_Mingw W64 - Fatal编程技术网

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

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

我正在将一些代码从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::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") );