hyq510 发表于 2016-8-17 03:08:44

为什么我重载了<运算符,但还是不能使用sort对结构体进行排序?

测试代码如下:
#include<iostream>
#include<algorithm>
#include<cstdlib>
using namespace std;

struct fun
{
      int a;
      int b;
      
      fun()
      {
                a=0;
                b=0;
      }
      
      bool operator < (fun sum)   
      {
                return b < sum.b;
      }
};   //定义结构提

int main()
{
      fun s={};
      for(int i=1;i<=10;i++)//对结构体变量进行赋值
      {
                s.a=rand()%20;
                s.b=rand()%20;
      }
      
      sort(&s,&s);//排序
      return 0;
}



错误信息:
In file included from /usr/include/c++/4.4/algorithm:62,
               from test.cpp:2:
/usr/include/c++/4.4/bits/stl_algo.h: In function ‘const _Tp& std::__median(const _Tp&, const _Tp&, const _Tp&) ’:
/usr/include/c++/4.4/bits/stl_algo.h:2268:   instantiated from ‘void std::__introsort_loop(_RandomAccessIterator, _RandomAccessIterator, _Size) ’
/usr/include/c++/4.4/bits/stl_algo.h:5220:   instantiated from ‘void std::sort(_RAIter, _RAIter) ’
test.cpp:32:   instantiated from here
/usr/include/c++/4.4/bits/stl_algo.h:89: error: passing ‘const fun’ as ‘this’ argument of ‘bool fun::operator<(fun)’ discards qualifiers
/usr/include/c++/4.4/bits/stl_algo.h:90: error: passing ‘const fun’ as ‘this’ argument of ‘bool fun::operator<(fun)’ discards qualifiers
/usr/include/c++/4.4/bits/stl_algo.h:92: error: passing ‘const fun’ as ‘this’ argument of ‘bool fun::operator<(fun)’ discards qualifiers
/usr/include/c++/4.4/bits/stl_algo.h:96: error: passing ‘const fun’ as ‘this’ argument of ‘bool fun::operator<(fun)’ discards qualifiers
/usr/include/c++/4.4/bits/stl_algo.h:98: error: passing ‘const fun’ as ‘this’ argument of ‘bool fun::operator<(fun)’ discards qualifiers







小马哥。 发表于 2016-8-17 08:24:22

struct fun 用 类 吧

黑龍 发表于 2016-8-17 09:42:23

是class不是struct= =

hyq510 发表于 2016-8-17 13:30:54

小马哥。 发表于 2016-8-17 08:24
struct fun 用 类 吧

用类一样不行,而且结构体和类好像没什么区别吧,只是缺省下元素的访问权限一个是public一个是provide

hyq510 发表于 2016-8-17 13:31:39

黑龍 发表于 2016-8-17 09:42
是class不是struct= =

用类一样不行,而且结构体和类好像没什么区别吧,只是缺省下元素的访问权限一个是public一个是provide

黑龍 发表于 2016-8-17 14:07:13

hyq510 发表于 2016-8-17 13:31
用类一样不行,而且结构体和类好像没什么区别吧,只是缺省下元素的访问权限一个是public一个是provide

{:5_99:}没完 你这个重载是怎么重载的= =

cosmosh73 发表于 2016-8-19 11:12:31

看看

Krant5 发表于 2016-8-20 22:17:28

本帖最后由 Krant5 于 2016-8-20 22:18 编辑

我改了一下没有错误了,至于对不对就不好说了,还是用类吧,另外,将重载运算符用友元函数类型才是正确的#include<iostream>
#include<algorithm>
#include<cstdlib>
using namespace std;

class fun
{
        public:
                int a;
                int b;

                fun()
                {
                        a=0;
                        b=0;
                }

                friend bool operator < (fun sum,fun sum1);
};
bool operator < (fun sum,fun sum1)
{
        return sum.b < sum1.b;
} //定义结构提

int main()
{
        fun s= {};
        for(int i=1; i<=10; i++) //对结构体变量进行赋值
        {
                s.a=rand()%20;
                s.b=rand()%20;
        }

        sort(&s,&s);//排序
        return 0;
}

hyq510 发表于 2016-8-21 04:53:27

Krant5 发表于 2016-8-20 22:17
我改了一下没有错误了,至于对不对就不好说了,还是用类吧,另外,将重载运算符用友元函数类型才是正确的

谢谢了,不过我更好奇的是为什么之前那个不行。
如果用之前那个结构体的话,单纯的测试<运算符也能正常工作,但是使用sort排序却不行。


哦,对了,你这个代码把class改成struct也并没有影响。
我记得struct和class的区别只是在于默认访问权限与继承方式。
刘汝佳的书里提到过。

iszhuangsha 发表于 2016-8-21 22:57:27

#include<iostream>
#include<algorithm>
#include<cstdlib>
using namespace std;

class fun{
public:
                int a;
                int b;
                fun():a(0),b(0){}
                friend bool operator < (fun sum1,fun sum2)   
      {
                return sum1.b < sum2.b;
      }
};   //定义结构提

int main()
{
      fun s={};
      for(int i=1;i<=10;i++)//对结构体变量进行赋值
      {
                s.a=rand()%20;
                s.b=rand()%20;
      }
      
      sort(s,s+10);//排序
      return 0;
}
你的问题应该是重载小于运算的时候需要两个操作数。

hyq510 发表于 2016-8-22 03:08:59

iszhuangsha 发表于 2016-8-21 22:57
你的问题应该是重载小于运算的时候需要两个操作数。

谢谢哈
页: [1]
查看完整版本: 为什么我重载了<运算符,但还是不能使用sort对结构体进行排序?