如何在虚拟类方法中使用std :: vector :: remove()?

时间:2017-01-08 17:38:28

标签: 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);
    }
};

这很好用。但是,我想从BeliefSet派生另一个类并覆盖此方法RemoveFact(),因此我将上面显示的代码更改为以下内容:

/* Rest of this class has not been changed. */

virtual void RemoveFact(const T Fact)
{
    m_Facts.remove(Fact);
}

现在,一旦我编译,我就会收到此错误:

error C2039: 'remove': is not a member of 'std::vector<std::string,std::allocator<_Ty>>'

我在这里做错了什么想法?

1 个答案:

答案 0 :(得分:6)

  

这很好用。

不,它没有。 std::vector没有成员函数remove()。但是,类模板成员函数并未被热切地实例化。您可能根本就没有调用RemoveFact(),因此您永远不会遇到此问题。这个&#34;懒惰&#34;实例化非常重要 - 它允许您编写和使用具有条件有效运算符的类模板,而无需编写SFINAE垃圾的负载(例如,我可以使用std::map使用非默认构造值类型,我只能&#39;使用operator[])。

当您创建函数virtual时,正如您继承它一样,您的编译器可能会尝试在该点实例化该函数(未指定实现是否这样做 - 您显然是这样做的)。由于此函数格式错误,因此通过virtual函数实例化而不是正常的函数实例化来获取错误。

无论哪种方式,该功能都被破坏了,你想要:

void RemoveFact(const T& Fact)
{
    m_Facts.erase(
        std::remove(m_Facts.begin(), m_Facts.end(), Fact),
        m_Facts.end());
}