我有以下课程:
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>>'
我在这里做错了什么想法?
答案 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());
}