2017-01-08 3 views
0

私は以下のクラスを持っている:仮想クラスメソッドでstd :: vector :: remove()を使用するには?

template <class T> 
class BeliefSet : public Belief<T> 
{ 
private: 
    std::vector<T> m_Facts; 

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

これが正常に動作します。

今のようにすぐに私は、私はこのエラーを取得するコンパイルと
/* 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>>' 
しかし、私はこのように、私は次のように上記のコードを変更し、 BeliefSetから別のクラスを派生し、この方法 RemoveFact()を上書きしたいです

私がここで間違っていることは何ですか?

+0

これは[MCVE] – StoryTeller

+2

のstd ::ベクトルが実際に削除を持っていない()関数ではないではありません。あなたの最初の例は実際には間違っていると思います。 – nos

+0

''うまく動作する '' remove() 'の完全な動作例を見せてもらえますか?私が知る限り、 'remove()'は 'std :: vector <>'ではなく 'std :: list <>'のメソッドです。 – max66

答えて

6

This works fine.

いいえ、そうではありません。 std::vectorにはメンバー機能がありませんremove()しかし、クラス・テンプレート・メンバー関数は熱心にインスタンス化されません。 RemoveFact()を呼び出すことは決してありませんでしたので、この問題に遭遇する必要はありませんでした。この「怠惰な」インスタンス化は非常に重要です。SFINAEの迷惑メールを書き込まずに条件付きで有効な演算子を持つクラステンプレートを作成して使用することができます(例えば、std::mapをデフォルト以外の建設的な値型で使用できます。 operator[])。

virtualを作成したときに、その時点でコンパイラがその関数をインスタンス化しようとしている可能性があります(実装がそうしているかどうかは不明です。この関数は不正な形式なので、通常の関数のインスタンス化ではなく、virtual関数のインスタンス化によってエラーが発生します。

いずれかの方法は、機能が壊れている、あなたがしたい:

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

非常に参考になりました、ありがとうございます。記録のためだけに、この解決法が機能するには、##include が必要でした。 – Matthias

関連する問題