我收到警告#12367 when running Build | Build Solution for Intel Static Analysis
,但我看不到代码的问题。任何想法?
警告#12367:在调用“std :: _ Vector_iterator>> std :: vector> :: erase(std :: _ Vector_const_iterator>>)”中作为实际参数2传递的对象的切片“由于隐式而发生类型转换
pragma warning(suppress: 4995)
#include <vector>
class __declspec(dllexport) MxPluginLib //nothing special here, not derived class etc
{
public:
// ...
private:
// ... nothing special here
};
class __declspec(dllexport) MxPluginManager
{
public:
//...
private:
#pragma warning(suppress: 4251)
std::vector<MxPluginLib *> _Libs;
};
bool MxPluginManager::DeleteNextUnselected()
{
bool erased = false;
size_t cnt = _Libs.size();
if (cnt > 0 )
{
for (size_t x = 0; x < cnt; x++)
{
if (_Libs[x]->GetSelection() == false)
{
delete _Libs[x];
_Libs[x] = '\0';
_Libs.erase(_Libs.begin()+x); //THIS IS WHERE THE WARNING IS GENERATED
erased = true;
break;
}
}
}
return erased;
}
答案 0 :(得分:0)
在我看来,唯一奇怪的是
_Libs[x] = '\0';
它可能会使分析器认为您存储的是chars而不是指针。既然你正在擦除元素,你根本不需要它 - 删除它,看它是否解决了你的问题。
答案 1 :(得分:0)
这一行
_Libs.erase(_Libs.begin()+x);
正在将vector::iterator
传递给期望vector::const_iterator
的函数。这没关系,并且需要工作(但标准并没有准确地说 它是如何工作的,只是iterator
可以转换为const_iterator
)。
在您的实现中,似乎iterator
派生自const_iterator
并且传递参数将通过“切片”派生部分将其转换为基类。
在这种情况下,这不是错误,可以忽略警告。