2012-03-20 6 views
1

からコードをエラーのJUNKを与える独自の比較子を使用すると、次のとおりです。C++はクラスオブジェクトの<>を設定します。次のようにC++の機能、のXtreeなど

#include<iostream> 
#include<string> 
#include<set> 
using namespace std; 

class data{ 
    int i; 
    float f; 
    char c; 
public: 
    bool operator()(data const& a1, data const& a2) const{ 
     return(a1.i < a2.i || 
      (!(a1.i > a2.i) && (a1.f < a2.f)) || 
      (!(a1.i > a2.i) && !(a1.f > a2.f) && (a1.c < a2.c))); 
    }; 
    data(); 
    data(int i,float f,char c); 
    int geti(); 
}; 

int data::geti(){ 
    return i; 
}; 
data::data(int i,float f,char c){ 
    this->i=i; 
    this->f=f; 
    this->c=c; 
}; 

int main(){ 
    set<data> s; 
    set<data>::iterator it; 
    s.insert(data(1,1.3,'a')); 
    s.insert(data(2,2.3,'b')); 
    s.insert(data(3,3.3,'c')); 
    if((it=s.find(data(1,1.3,'a')))!=s.end()) 
     cout<<(*it).geti(); 
    cin.get(); 
    return 0; 
} 

この質問は後に、それからエラーのJUNKを与えているコンパイルでC++ set Question

に変更を提案しています。 。\ vc \ include \ functionalと.. \ vc \ include \ xtree

エラーを分類するのを手伝ってください。おかげさまで

エラー:

1>c:\program files\microsoft visual studio 8\vc\include\functional(143) : error C2784: 'bool std::operator <(const std::_Tree<_Traits> &,const std::_Tree<_Traits> &)' : could not deduce template argument for 'const std::_Tree<_Traits> &' from 'const data' 
1>  c:\program files\microsoft visual studio 8\vc\include\xtree(1372) : see declaration of 'std::operator <' 
1>  c:\program files\microsoft visual studio 8\vc\include\functional(142) : while compiling class template member function 'bool std::less<_Ty>::operator()(const _Ty &,const _Ty &) const' 
1>  with 
1>  [ 
1>   _Ty=data 
1>  ] 
1>  c:\program files\microsoft visual studio 8\vc\include\set(60) : see reference to class template instantiation 'std::less<_Ty>' being compiled 
1>  with 
1>  [ 
1>   _Ty=data 
1>  ] 
1>  c:\program files\microsoft visual studio 8\vc\include\xtree(26) : see reference to class template instantiation 'std::_Tset_traits<_Kty,_Pr,_Alloc,_Mfl>' being compiled 
1>  with 
1>  [ 
1>   _Kty=data, 
1>   _Pr=std::less<data>, 
1>   _Alloc=std::allocator<data>, 
1>   _Mfl=false 
1>  ] 
1>  c:\program files\microsoft visual studio 8\vc\include\xtree(68) : see reference to class template instantiation 'std::_Tree_nod<_Traits>' being compiled 
1>  with 
1>  [ 
1>   _Traits=std::_Tset_traits<data,std::less<data>,std::allocator<data>,false> 
1>  ] 
1>  c:\program files\microsoft visual studio 8\vc\include\xtree(94) : see reference to class template instantiation 'std::_Tree_ptr<_Traits>' being compiled 
1>  with 
1>  [ 
1>   _Traits=std::_Tset_traits<data,std::less<data>,std::allocator<data>,false> 
1>  ] 
1>  c:\program files\microsoft visual studio 8\vc\include\xtree(112) : see reference to class template instantiation 'std::_Tree_val<_Traits>' being compiled 
1>  with 
1>  [ 
1>   _Traits=std::_Tset_traits<data,std::less<data>,std::allocator<data>,false> 
1>  ] 
1>  c:\program files\microsoft visual studio 8\vc\include\set(69) : see reference to class template instantiation 'std::_Tree<_Traits>' being compiled 
1>  with 
1>  [ 
1>   _Traits=std::_Tset_traits<data,std::less<data>,std::allocator<data>,false> 
1>  ] 
1>  c:\users\nitin_thokare\documents\visual studio 2005\projects\cpp\stl\ex_sets.cpp(31) : see reference to class template instantiation 'std::set<_Kty>' being compiled 
1>  with 
1>  [ 
1>   _Kty=data 
1>  ] 
1>c:\program files\microsoft visual studio 8\vc\include\functional(143) : error C2784: 'bool std::operator <(const std::basic_string<_Elem,_Traits,_Alloc> &,const _Elem *)' : could not deduce template argument for 'const std::basic_string<_Elem,_Traits,_Alloc> &' from 'const data' 
1>  c:\program files\microsoft visual studio 8\vc\include\string(151) : see declaration of 'std::operator <' 
1>c:\program files\microsoft visual studio 8\vc\include\functional(143) : error C2784: 'bool std::operator <(const _Elem *,const std::basic_string<_Elem,_Traits,_Alloc> &)' : could not deduce template argument for 'const _Elem *' from 'const data' 
1>  c:\program files\microsoft visual studio 8\vc\include\string(141) : see declaration of 'std::operator <' 
1>c:\program files\microsoft visual studio 8\vc\include\functional(143) : error C2784: 'bool std::operator <(const std::basic_string<_Elem,_Traits,_Alloc> &,const std::basic_string<_Elem,_Traits,_Alloc> &)' : could not deduce template argument for 'const std::basic_string<_Elem,_Traits,_Alloc> &' from 'const data' 
1>  c:\program files\microsoft visual studio 8\vc\include\string(131) : see declaration of 'std::operator <' 
1>c:\program files\microsoft visual studio 8\vc\include\functional(143) : error C2784: 'bool std::operator <(const std::reverse_iterator<_RanIt> &,const std::reverse_iterator<_RanIt2> &)' : could not deduce template argument for 'const std::reverse_iterator<_RanIt> &' from 'const data' 
1>  c:\program files\microsoft visual studio 8\vc\include\xutility(1880) : see declaration of 'std::operator <' 
1>c:\program files\microsoft visual studio 8\vc\include\functional(143) : error C2784: 'bool std::operator <(const std::pair<_Ty1,_Ty2> &,const std::pair<_Ty1,_Ty2> &)' : could not deduce template argument for 'const std::pair<_Ty1,_Ty2> &' from 'const data' 
1>  c:\program files\microsoft visual studio 8\vc\include\utility(76) : see declaration of 'std::operator <' 
1>c:\program files\microsoft visual studio 8\vc\include\functional(143) : error C2676: binary '<' : 'const data' does not define this operator or a conversion to a type acceptable to the predefined operator 

答えて

1

オペレータ<は以下のように、またはクラスの外の友人のオペレーターとして、ミスであり、それは、便利なメンバ関数として書かれています:

int geti() const; 

int geti() const; 

bool operator<(data const& a2) const { 
    data const& a1 = *this; 
    return(a1.i < a2.i || 
     (!(a1.i > a2.i) && (a1.f < a2.f)) || 
     (!(a1.i > a2.i) && !(a1.f > a2.f) && (a1.c < a2.c))); 
}; 

また、あなたは、修飾constを忘れます

+0

なぜこのconstは必要ですか? geti()のconstを使用しなくてもうまく動作していることがわかったからです。 –

+0

あなたの場合は本当に必要ではありませんが、STLインターフェイスがconst&を要求するプロパティにアクセスすることはできません。典型的なケースは自由関数演算子<(const data&a1、const data&a2)です。 – CapelliC

0

dataタイプはstd::setによって要求された比較演算子<を持っていません。おそらく、

bool operator < (data const& a2) const { 
    return(i < a2.i || 
     (!(i > a2.i) && (f < a2.f)) || 
     (!(i > a2.i) && !(f > a2.f) && (c < a2.c))); 
} 

の代わりにdata::operator()を持つことを意味します。

1

既に記載されている他のものとしてoperator<を使用するか、またはstd::setという2番目のテンプレートパラメータにdataを使用してください。

template< 
    class Key, 
    class Compare = std::less<Key>, 
    class Allocator = std::allocator<Key> 
> class set; 

だから、あなたがセットのタイプとしてstd::set<data,data>使用します。

std::set宣言を参照してください。この方法でoperator()を使用してdataオブジェクトを比較します。

1

Boostを使用すると、私は定型句に疲れています。

class data { 
    ... 
public: 
    bool operator<(data const& other) const { 
    return boost::tie(this->i, this->f, this->c) 
     < boost::tie(other.i, other.f, other.c); 
    } 


}; 

あなたのバージョンよりもはるかに読みやすくなります。

+0

+1面白いですが、セマンティックにマッチするのはそれほど簡単ではありません。私は "boost/tuple/tuple_comparison.hpp"をインクルードしました。あなたのヒントはコンパイルされますが、コードは同等ではないと感じています。 – CapelliC

+0

@chac:セマンティクスは同等です。タプルは辞書順で比較されます。つまり、2つの最初の項目が比較されます。結果が分からない場合は、次の項目などに移動します。最初は奇妙な感じがする場合は、これに慣れれば、この演算子を書く方がはるかに簡単になり、より重要なのは意図したとおりに動作すること(コードが少なく、バグも少なくなる)です。 –

+0

確かに、私の脳を超えているすべての*、*、*、*、*、*のブール式を正確に追跡することはできません...もちろん、私はまったく同じ理由で、元の表現は正しい。私は別の方法でそれを書いていただろうが、あなたは間違いなく私に正しい道を示す... – CapelliC

関連する問題