C ++设置<>类对象。 利用自己的比较器给人的功能,的XTree等错误JUNK(c

2019-09-26 13:51发布

在C ++中的代码如下:

#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;
}

这个问题被提出后,在修改C ++设置问题

在编译时它给错误的垃圾从.. \ VC \包括\功能和.. \ VC \包括\的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

Answer 1:

运营商<是怀念,它的方便写成成员函数,如下,或作为类外朋友符:

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修饰符:

int geti() const;


Answer 2:

既可以使用供给operator<作为其他已经提到的,或使用data为的第二个模板参数std::set

std::set声明:

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

所以,你会使用std::set<data,data>为您设置的类型。 这样一来,你的operator()将被用于比较的data对象。



Answer 3:

使用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);
  }


};

很多很多,比你的版本更具可读性。



Answer 4:

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()



文章来源: c++ set<> of class objects. Using own comparer giving JUNK of errors from functional, xtree etc