所以我有一段旧代码,我试图调试
#include <string>
#include <map>
int main()
{
std::map<std::wstring, std::wstring> filters;
...
for (auto filterIter : filters)
{
...
wchar_t* nameArray = new wchar_t[filterIter.first.size() + 1];
std::copy(filterIter.first.begin(), filterIter.first.end(), nameArray);
nameArray[filterIter.first.size()] = '\0';
...
LPCWSTR pszName = nameArray;
}
getchar();
return 0;
}
这里的问题是我收到这个警告说:
warning C4996: 'std::copy::_Unchecked_iterators::_Deprecate': Call to 'std::copy' with parameters that may be unsafe - this call relies on the caller to check that the passed values are correct. To disable this warning, use -D_SCL_SECURE_NO_WARNINGS. See documentation on how to use Visual C++ 'Checked Iterators'
我想解决这个警告,而不必沉默警告。我知道问题在于nameArray是一个常规指针而不是Output iterator。并且std :: copy要我在std :: copy last参数中输入输出迭代器。我想让这段代码符合std :: copy要我做的事情。什么是实现这一目标的优雅方式?
我确实考虑过创建自己的迭代器类,但那真的很优雅吗?
答案 0 :(得分:0)
我打算回答这个问题,因为我认为我已经弄明白了,这会帮助遇到这个问题的其他人:
事实证明,这是一种非常简单的C复制方式。由于LPCWSTR
只是一个wchar_t,我最终只是这样做而且我不再遇到编译器错误。我将运行测试以确保此功能仍然表现相同。
注意:我没有编写此代码,这只是我正在查看的遗留代码。
这是更新版本
#include <string>
#include <map>
int main()
{
std::map<std::wstring, std::wstring> filters;
...
for (auto filterIter : filters)
{
...
LPCWSTR pszName = filterIter.first.c_str();
...
}
getchar();
return 0;
}