C++ 如何在虚拟类方法中使用std::vector::remove()?
我有以下课程:C++ 如何在虚拟类方法中使用std::vector::remove()?,c++,c++11,vector,C++,C++11,Vector,我有以下课程: template <class T> class BeliefSet : public Belief<T> { private: std::vector<T> m_Facts; public: void RemoveFact(const T Fact) { m_Facts.remove(Fact); } }; 现在,我一编译就出现以下错误: error C2039: 'remove': is
template <class T>
class BeliefSet : public Belief<T>
{
private:
std::vector<T> m_Facts;
public:
void RemoveFact(const T Fact)
{
m_Facts.remove(Fact);
}
};
现在,我一编译就出现以下错误:
error C2039: 'remove': is not a member of 'std::vector<std::string,std::allocator<_Ty>>'
错误C2039:“删除”:不是“std::vector”的成员
你知道我做错了什么吗
这个很好用
不,没有std::vector
没有成员函数remove()
。然而,类模板成员函数并不急于实例化。很可能您从未调用过RemoveFact()
,因此您从未遇到过这个问题。这种“惰性”实例化非常重要-它允许您编写和使用具有条件有效运算符的类模板,而无需编写SFINAE垃圾加载(例如,我可以使用std::map
fine和非默认构造值类型,我只是不能使用运算符[]
)
当您将函数设置为虚拟时,当您从它继承时,很可能是您的编译器试图在该点实例化该函数(未指定实现是否这样做-您的实现显然是这样)。由于此函数的格式不正确,因此通过virtual
函数实例化而不是正常的函数实例化得到错误
无论哪种情况,函数都已损坏,您需要:
void RemoveFact(const T& Fact)
{
m_Facts.erase(
std::remove(m_Facts.begin(), m_Facts.end(), Fact),
m_Facts.end());
}
这个很好用
不,没有std::vector
没有成员函数remove()
。然而,类模板成员函数并不急于实例化。很可能您从未调用过RemoveFact()
,因此您从未遇到过这个问题。这种“惰性”实例化非常重要-它允许您编写和使用具有条件有效运算符的类模板,而无需编写SFINAE垃圾加载(例如,我可以使用std::map
fine和非默认构造值类型,我只是不能使用运算符[]
)
当您将函数设置为虚拟时,当您从它继承时,很可能是您的编译器试图在该点实例化该函数(未指定实现是否这样做-您的实现显然是这样)。由于此函数的格式不正确,因此通过virtual
函数实例化而不是正常的函数实例化得到错误
无论哪种情况,函数都已损坏,您需要:
void RemoveFact(const T& Fact)
{
m_Facts.erase(
std::remove(m_Facts.begin(), m_Facts.end(), Fact),
m_Facts.end());
}
这不是std::vector,它确实没有remove()函数。我认为你错了,你的第一个例子实际上是有效的。你能给我们展示一下remove()
的完整工作例子吗?据我所知,remove()
是std::list
的方法,而不是std::vector
的方法。这不是std::vector确实没有remove()函数。我认为你错了,你的第一个例子实际上是有效的。你能给我们展示一下remove()
的完整工作例子吗?据我所知,remove()
是std::list
的一种方法,而不是std::vector
。非常有用,非常感谢。记录在案:我必须#包括,这个解决方案才能工作。非常有用,非常感谢。记录在案:我必须#包括,才能让这个解决方案起作用。