Abh*_*jit 7 c++ visual-c++ c++11 visual-studio-2012
我知道这个问题在SO中被多次询问过,但这与其他问题有所不同.
xutility(2227):警告C4996:'std :: _ Copy_impl'
失败的代码片段
DWORD dwNumberOfNames = pExportDirectory->NumberOfNames;
LPDWORD dwNames = (LPDWORD)((LPBYTE)hDLL + pExportDirectory->AddressOfNames);
std::vector< std::string > exports;
std::copy(
dwNames,
dwNames + dwNumberOfNames,
[&exports, &hDLL](DWORD dwFuncOffset)
{
std::string fname = std::string((PCHAR)((PBYTE)hDLL + dwFuncOffset));
exports.push_back(fname);
}
);
Run Code Online (Sandbox Code Playgroud)
编译错误
错误1错误C4996:'std :: _ Copy_impl':带有可能不安全的参数的函数调用 - 此调用依赖于调用者来检查传递的值是否正确.要禁用此警告,请使用-D_SCL_SECURE_NO_WARNINGS.请参阅有关如何使用Visual C++'Checked Iterators'的文档:C:\ Program Files(x86)\ Microsoft Visual Studio 11.0\VC\include\xutility 2176
题
考虑到,C4996,意味着该功能已标记为已弃用问题在哪里?
std::copy
用C Array
?注意
我知道,如何压制警告,但我很想知道,问题的根本原因是什么?
此外,同样重要的是,我知道,在不影响代码质量的情况下处理此问题的便携方式.
你不是std::copy
根据msdn 打电话:http://msdn.microsoft.com/en-us/library/x9f6s1wf.aspx
那个函数签名是这样的:
template<class InputIterator, class OutputIterator>
OutputIterator copy(
InputIterator _First,
InputIterator _Last,
OutputIterator _DestBeg
);
Run Code Online (Sandbox Code Playgroud)
那里没有functor/lambda的地方.
你也没有打电话std::copy_if
:http://msdn.microsoft.com/en-us/library/ee384415.aspx
template<class InputIterator, class OutputIterator, class BinaryPredicate>
OutputIterator copy_if(
InputIterator _First,
InputIterator _Last,
OutputIterator _Dest,
Predicate _Pred
);
Run Code Online (Sandbox Code Playgroud)
因为你没有输出迭代器,你的谓词也没有返回bool.
它看起来像你想要的std::transform
:http://msdn.microsoft.com/en-us/library/391xya49.aspx
template<class InputIterator, class OutputIterator, class UnaryFunction>
OutputIterator transform(
InputIterator _First1,
InputIterator _Last1,
OutputIterator _Result,
UnaryFunction _Func
);
Run Code Online (Sandbox Code Playgroud)
你应该在输出迭代器中返回你想要的值.所以它会是这样的:
std::transform(
dwNames,
dwNames + dwNumberOfNames,
std::back_inserter(exports),
[&hDLL](DWORD dwFuncOffset) // This lambda is WRONG
{
// THIS LINE IS WRONG
std::string fname = std::string((PCHAR)((PBYTE)hDLL + dwFuncOffset));
return fname;
}
);
Run Code Online (Sandbox Code Playgroud)
我的lambda错了.您需要输入数组的ELEMENTS(我不确定类型)作为lambda的参数,并返回要插入到exports
向量中的内容.
你可能也不知道back_inserter
.它在<iterator>
标题中.请参阅此处:http://msdn.microsoft.com/en-us/library/12awccbs.aspx ,此处:http://www.cplusplus.com/reference/iterator/back_inserter/
这可能不是100%的答案,但有了这个,我想你可以到达你想去的地方.
归档时间: |
|
查看次数: |
16896 次 |
最近记录: |