Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/158.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::vector::remove()?_C++_C++11_Vector - Fatal编程技术网

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
。非常有用,非常感谢。记录在案:我必须
#包括
,这个解决方案才能工作。非常有用,非常感谢。记录在案:我必须
#包括
,才能让这个解决方案起作用。