C ++-排序算法看不到用户定义类型的重载“ <”运算符

如何解决C ++-排序算法看不到用户定义类型的重载“ <”运算符

bool operator<(Fraction& first,Fraction& second)

问题在于您的重载operator<仅接受非常量参数,但是算法试图将对a的常量引用Fraction与容器中的元素进行比较。

由于operator<修改比较对象的内容,因此应通过const引用来获取它们:

bool operator<(Fraction const & first,Fraction const & second)

解决方法

好的,所以我有一个名为1的用户定义类型fraction,它表示具有分子和分母的普通分数。这是代码:

class Fraction
{
private:
  int numerator;
  int denominator;

public:
  Fraction(int numer,int denom)
    :numerator(numer),denominator(denom){}

  int get_denom(){return denominator;}
  int get_numer(){return numerator;}
};

如您所见,它完全在头文件中实现。

因此,我要使用排序算法对分数向量进行排序。这是重载的“ <”运算符的代码(注意:它与Fraction类放在同一文件中,但在类的外部):

bool operator<(Fraction& first,Fraction& second)
{
  if(first.get_denom() == second.get_denom())
  {
    return first.get_numer()<second.get_numer()?true:false;
  }
  int first_num=first.get_denom();
  int second_num=second.get_denom();
  int lcm=(first_num*second_num)/gcd(first_num,second_num);
  int first_new_numerator=(lcm/first_num)*first.get_numer();
  int second_new_numerator=(lcm/second_num)*second.get_numer();

  return first_new_numerator<second_new_numerator?true:false;
}

它所做的是检查分母是否相等,然后测试分子的值。如果它们不相等,则使用最小公倍数和gcd均衡它们。

真正的问题开始于我想在main中使用排序算法(编译时错误),这是主要代码:

Fraction parse_fraction(string& input)
{

  stringstream fraction_string(input);
  int numer;
  fraction_string>>numer;
  char seperator;
  fraction_string>>seperator;
  int denom;
  fraction_string>>denom;

  return Fraction(numer,denom);
}


int main()
{
  vector<Fraction> fractions;
  string input;
  while(cin>>input)
  {
    if(input=="|") break;
    fractions.push_back(parse_fraction(input));
  }

  sort(fractions.begin(),fractions.end);

  for(int i=0;i<fractions.size();i++)
  {
    cout<<fractions[i];
  }

  return 0;
}

我得到的错误是(注意:我已经适当地重载了“ <<”运算符的分数,但不想在这里造成混乱):

/usr/include/c++/4.6/bits/stl_algo.h||In function ‘_RandomAccessIterator std::__unguarded_partition(_RandomAccessIterator,_RandomAccessIterator,const _Tp&) [with _RandomAccessIterator = __gnu_cxx::__normal_iterator<Fraction*,std::vector<Fraction> >,_Tp = Fraction]’:|

/usr/include/c++/4.6/bits/stl_algo.h:2253|70|instantiated from ‘_RandomAccessIterator std::__unguarded_partition_pivot(_RandomAccessIterator,_RandomAccessIterator) [with _RandomAccessIterator = __gnu_cxx::__normal_iterator<Fraction*,std::vector<Fraction> >]’|

/usr/include/c++/4.6/bits/stl_algo.h:2284|54|instantiated from ‘void std::__introsort_loop(_RandomAccessIterator,_Size) [with _RandomAccessIterator = __gnu_cxx::__normal_iterator<Fraction*,_Size = long int]’|

/usr/include/c++/4.6/bits/stl_algo.h:5330|4|instantiated from ‘void std::sort(_RAIter,_RAIter) [with _RAIter = __gnu_cxx::__normal_iterator<Fraction*,std::vector<Fraction> >]’|

/home/vanio/Desktop/workspace/C++/Ordner/main.cpp:35|43|instantiated from here|

/usr/include/c++/4.6/bits/stl_algo.h|2212|error: no match for ‘operator<’ in ‘__first.__gnu_cxx::__normal_iterator<_Iterator,_Container>::operator* [with _Iterator = Fraction*,_Container = std::vector<Fraction>,__gnu_cxx::__normal_iterator<_Iterator,_Container>::reference = Fraction&]() < __pivot’|

/usr/include/c++/4.6/bits/stl_algo.h|2212|note: candidates are:|

/usr/include/c++/4.6/bits/stl_pair.h|207|note: template<class _T1,class _T2> bool std::operator<(const std::pair<_T1,_T2>&,const std::pair<_T1,_T2>&)|

/usr/include/c++/4.6/bits/stl_iterator.h|291|note: template<class _Iterator> bool std::operator<(const std::reverse_iterator<_Iterator>&,const std::reverse_iterator<_Iterator>&)|

/usr/include/c++/4.6/bits/stl_iterator.h|341|note: template<class _IteratorL,class _IteratorR> bool std::operator<(const std::reverse_iterator<_IteratorL>&,const std::reverse_iterator<_IteratorR>&)|

/usr/include/c++/4.6/bits/basic_string.h|2510|note: template<class _CharT,class _Traits,class _Alloc> bool std::operator<(const std::basic_string<_CharT,_Traits,_Alloc>&,const std::basic_string<_CharT,_Alloc>&)|

/usr/include/c++/4.6/bits/basic_string.h|2522|note: template<class _CharT,const _CharT*)|

/usr/include/c++/4.6/bits/basic_string.h|2534|note: template<class _CharT,class _Alloc> bool std::operator<(const _CharT*,_Alloc>&)|

/usr/include/c++/4.6/bits/stl_vector.h|1290|note: template<class _Tp,class _Alloc> bool std::operator<(const std::vector<_Tp,const std::vector<_Tp,_Alloc>&)|

/home/vanio/Desktop/workspace/C++/Ordner/Fraction.h|39|note: bool operator<(Fraction&,Fraction&)|

/home/vanio/Desktop/workspace/C++/Ordner/Fraction.h|39|note:   no known conversion for argument 2 from ‘const Fraction’ to ‘Fraction&’|

/usr/include/c++/4.6/bits/stl_algo.h|2215|error: no match for ‘operator<’ in ‘__pivot < __last.__gnu_cxx::__normal_iterator<_Iterator,_Container>::reference = Fraction&]()’|

/usr/include/c++/4.6/bits/stl_algo.h|2215|note: candidates are:|

/usr/include/c++/4.6/bits/stl_pair.h|207|note: template<class _T1,Fraction&)|

/home/vanio/Desktop/workspace/C++/Ordner/Fraction.h|39|note:   no known conversion for argument 1 from ‘const Fraction’ to ‘Fraction&’|
||=== Build finished: 22 errors,0 warnings ===|

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?
Java在半透明框架/面板/组件上重新绘画。
Java“ Class.forName()”和“ Class.forName()。newInstance()”之间有什么区别?
在此环境中不提供编译器。也许是在JRE而不是JDK上运行?
Java用相同的方法在一个类中实现两个接口。哪种接口方法被覆盖?
Java 什么是Runtime.getRuntime()。totalMemory()和freeMemory()?
java.library.path中的java.lang.UnsatisfiedLinkError否*****。dll
JavaFX“位置是必需的。” 即使在同一包装中
Java 导入两个具有相同名称的类。怎么处理?
Java 是否应该在HttpServletResponse.getOutputStream()/。getWriter()上调用.close()?
Java RegEx元字符(。)和普通点?