2016-05-01 20 views
-1

私はベクトルと構造体を取り込み、その構造体をベクトルに挿入するテンプレート関数を書いています。ただし、ベクトルに重複する構造体がある場合、値はすべて一意でなければならないため、関数は構造体を挿入しません。これを行うために、STLライブラリのfind関数を使用して、operator==を使用して戻り値を分析しています。マイテンプレート関数は以下見ることができます演算子==テンプレート関数では機能しません

error: no match for 'operator==' (operand types are 'OneToOneMap' and'OneToOneMap')| 

template<typename Type> void AddToList(vector<Type> add_to, Type to_insert){ 
    bool contains_element = *find(add_to.begin(), add_to.end(), to_insert) == *add_to.end() ? false:true; 

    if(contains_element){ 
     cout << "Element is already in list" << endl; 
    }else{ 
     add_to.push_back(to_insert); 
    } 
} 
+0

関連のないプログラミング言語にタグを付けないでください。 –

+0

あなたの質問は何ですか? – juanchopanza

+0

さて、あなたは 'OneToOneMap'クラスの' operator == 'をオーバーロードしていないと思いますか? – ArchbishopOfBanterbury

答えて

1

質問はしかし、私はあなたが持っていない疑いが完全には明らかではないが、私はこのエラーに私がしようとすると、コンパイルするたびに取得していますあなたのコードで比較しようとしているクラス/構造体OneToOneMapoperator==がオーバーロードされました。次のようにこれは、ユーザー定義型であると仮定すると、この演算子をオーバーロード(およびoperator!=):

class OneToOneMap { 

public: 

    //... 

    bool operator==(const OneToOneMap& _other) const { 
     // do comparison based on fields 
    } 

    bool operator!=(const OneToOneMap& _other) const { 
     return !(*this == _other); 
    } 

}; 
+0

これを指摘してくれてありがとう、私はそれを忘れていました。これをやることを回避する方法はありますか?この関数は多くの型の構造体からなるリストを比較するので、これらの構造体の演算子オーバーロードを書く代わりに大きな時間/コード節約者になるでしょう – kenb

+0

はい、@iksemyonovによって提供される解決策は、タイプではなくイテレータの – ArchbishopOfBanterbury

+0

@kenb上記の私の答えを参照してください。 findでは、値ではなくイテレータを比較します。 – iksemyonov

1

編集

ineedでは、対象を、あなたがstd::find<T>()を使用するタイプのオーバーロードを提供する必要がありますに!その理由は、もちろん、関数がコンテナ要素を比較して等しいかどうかを判断する方法が必要なためです。 ArchbishopOfBanterburyが気付い​​たようにbool T::operator==(const T& other)のオーバーロードを提供してください。

(ユーザーが要素を比較するために、別の述語を提供していないときに、より正確に、bool operator==(...)を使用して比較が使用されるためには、http://en.cppreference.com/w/cpp/algorithm/findを参照してください)

オリジナルの答え:

不要な間接参照演算子を削除します*イテレータを比較:

bool contains_element = find(add_to.begin(), add_to.end(), to_insert) == add_to.end() ? false:true; 

あなたは、どちらかのシンクをfalse : trueを必要としません電子比較はboolを返します。

bool contains_element = find(add_to.begin(), add_to.end(), to_insert) == add_to.end(); 

ロジックがfind<T>()ができているかどうかを確認するために、「ヌル」イテレータすなわち、std::find<T>()関数はイテレータを返し、あなたがvector<T>::end()イテレータにそのイテレータを比較することです何かを見つけるかどうか。 T値自体を比較する必要はありません。

+0

@ikseniymyonovと同様にそのエラーをキャッチしてくれてありがとう。しかし、同じエラーが再度ポップアップし、私はなぜそれほど確かではありません。私は何らかの理由で==演算子を依然としてオーバーロードしなければならないように見えます。 – kenb

+0

@kenb更新された回答を参照してください。この回答に誤解を招くような最初の試みをおかけして申し訳ありません。 – iksemyonov

関連する問題