Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/139.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(msvc c+;和#x2B;20)上使用std::remove_时发出警告_C++_Visual C++ - Fatal编程技术网

C++ 在std::wstring(msvc c+;和#x2B;20)上使用std::remove_时发出警告

C++ 在std::wstring(msvc c+;和#x2B;20)上使用std::remove_时发出警告,c++,visual-c++,C++,Visual C++,当获取winapi HWND并返回wstring时,我有一个函数 std::wstring utility::winapi::window_class(HWND hwnd) { int title_length = 20; std::wstring class_name; class_name.resize(title_length, '\0'); GetClassName(hwnd, const_cast<LPWSTR>(class_name.c_s

当获取winapi HWND并返回wstring时,我有一个函数

std::wstring utility::winapi::window_class(HWND hwnd) {
    int title_length = 20;
    std::wstring class_name;
    class_name.resize(title_length, '\0');
    GetClassName(hwnd, const_cast<LPWSTR>(class_name.c_str()), title_length);
    class_name.erase(std::remove_if(class_name.begin(), class_name.end(), [](const char &x){return x == '\0';}), class_name.end());
    return class_name;
}

std::wstring实用工具::winapi::window_类(HWND-HWND){
int title_length=20;
std::wstring类名称;
类名称。调整大小(标题长度,“\0”);
GetClassName(hwnd,const_cast(class_name.c_str()),title_length);
class_name.erase(std::remove_if(class_name.begin(),class_name.end(),[](const char&x){return x='\0';}),class_name.end());
返回类名称;
}
我得到以下错误:

C:\Program Files (x86)\Microsoft Visual Studio\2019\BuildTools\VC\Tools\MSVC\14.27.29110\include\xmemory(2040): error C2220: the following warning is treated as an error
..\..\libs\utility\src\winapi.cpp(44): note: see reference to function template instantiation '_FwdIt std::remove_if<std::_String_iterator<std::_String_val<std::_Simple_types<_Elem>>>,utility::winapi::window_class::<lambda_1>>(_FwdIt,const _FwdIt,_Pr)' being compiled
        with
        [
            _FwdIt=std::_String_iterator<std::_String_val<std::_Simple_types<wchar_t>>>,
            _Elem=wchar_t,
            _Pr=utility::winapi::window_class::<lambda_1>
        ]
C:\Program Files (x86)\Microsoft Visual Studio\2019\BuildTools\VC\Tools\MSVC\14.27.29110\include\xmemory(2040): warning C4244: 'argument': conversion from 'wchar_t' to 'const char', possible loss of data
C:\Program Files (x86)\Microsoft Visual Studio\2019\BuildTools\VC\Tools\MSVC\14.27.29110\include\xutility(5667): warning C4244: 'argument': conversion from '_Elem' to 'const char', possible loss of data
        with
        [
            _Elem=wchar_t
        ]
C:\Program Files (x86)\Microsoft Visual Studio\2019\BuildTools\VC\Tools\MSVC\14.27.29110\include\xmemory(2036): note: see reference to function template instantiation '_InIt std::find_if<wchar_t*,_Fn>(_InIt,const _InIt,_Pr)' being compiled
        with
        [
            _InIt=wchar_t *,
            _Fn=utility::winapi::window_class::<lambda_1>,
            _Pr=utility::winapi::window_class::<lambda_1>
        ]
..\..\libs\utility\src\winapi.cpp(44): note: see reference to function template instantiation '_FwdIt std::remove_if<std::_String_iterator<std::_String_val<std::_Simple_types<_Elem>>>,utility::winapi::window_class::<lambda_1>>(_FwdIt,const _FwdIt,_Pr)' being compiled
        with
        [
            _FwdIt=std::_String_iterator<std::_String_val<std::_Simple_types<wchar_t>>>,
            _Elem=wchar_t,
            _Pr=utility::winapi::window_class::<lambda_1>
        ]
ninja: build stopped: subcommand failed.

C:\Program Files(x86)\Microsoft Visual Studio\2019\BuildTools\VC\Tools\MSVC\14.27.29110\include\xmemory(2040):错误C2220:以下警告被视为错误
..\..\libs\utility\src\winapi.cpp(44):注意:如果正在编译(_-FwdIt,const-FwdIt,_-Pr),请参阅函数模板实例化“_-FwdIt std::remove_”的参考
具有
[
_FwdIt=std::\u字符串\u迭代器,
_Elem=wchar\t,
_Pr=实用工具::winapi::窗口类::
]
C:\Program Files(x86)\Microsoft Visual Studio\2019\BuildTools\VC\Tools\MSVC\14.27.29110\include\xmemory(2040):警告C4244:“参数”:从“wchar\u t”转换为“const char”,可能会丢失数据
C:\Program Files(x86)\Microsoft Visual Studio\2019\BuildTools\VC\Tools\MSVC\14.27.29110\include\xutility(5667):警告C4244:“参数”:从“\u Elem”转换为“const char”,可能会丢失数据
具有
[
_Elem=wchar\t
]
C:\Program Files(x86)\Microsoft Visual Studio\2019\BuildTools\VC\Tools\MSVC\14.27.29110\include\xmemory(2036):注意:请参阅正在编译的函数模板实例化“\u InIt std::find\u if(\u InIt,const\u InIt,\u Pr)”的参考
具有
[
_InIt=wchar\u t*,
_Fn=实用工具::winapi::窗口类::,
_Pr=实用工具::winapi::窗口类::
]
..\..\libs\utility\src\winapi.cpp(44):注意:如果正在编译(_-FwdIt,const-FwdIt,_-Pr),请参阅函数模板实例化“_-FwdIt std::remove_”的参考
具有
[
_FwdIt=std::\u字符串\u迭代器,
_Elem=wchar\t,
_Pr=实用工具::winapi::窗口类::
]
忍者:构建停止:子命令失败。
这个错误是什么意思


UPD:更新时出现完全错误。

类名称
声明为
std::wstring
。这是一个
wchar\u t
值的字符串,但lambda参数的类型是
const char&
,更窄。警告告诉您该值可能被截断。这可能会导致测试
x='\0'
在应该注意时计算为true。这就是编译器试图告诉您的:

warning C4244: 'argument': conversion from 'wchar_t' to 'const char', possible loss of data
作为旁注,没有理由通过引用获取数值参数。在这种情况下,可能会产生相同的程序集,因为lambda几乎肯定是内联的,但不使用引用更干净

要修复警告,请将lambda更改为接受
wchar\u t

[](wchar_t x){return x == '\0';})
由于C++14,您还可以使用
auto
作为参数类型:

[](auto x){return x == '\0';})

还有编译器输出吗?它表示有警告,但你的问题中唯一的东西是一张便条。注释通常伴随着错误或警告,它们不会自己出现。@cdhowie updated
const\u cast(class\u name.c\u str())
通常是一个非常糟糕的主意。首先也是最重要的一点是,字符串的大小不会正确更新(一个
std::string
/
std::wstring
可以包含嵌入的零,这是正常的空终止符)。使用
wchar\u t
的普通数组,然后使用它初始化
std::wstring
对象。或者,这就是为什么要使用擦除/删除(如果)位的原因?要更改字符串的结尾吗?那么,如果使用数组,则不必这样做,然后只需
返回该数组,将创建具有适当长度的
std::wstring
对象。请注意,从C++17开始,
data()
成员函数返回的指针不是指向常量的指针。如果您使用的是C++17,只需将
const\u cast(class\u name.C\u str())
替换为
class\u name.data()
。但是,按照上面的注释使用本地数组作为缓冲区会更好。谢谢,使用wchar\u t和更改const char&都有效。使用wchar\t数组看起来更好。