好的,所以我有一个名为1的用户定义类型fraction,它表示具有分子和分母的普通分数。这是代码:
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, _RandomAccessIterator, _Size) [with _RandomAccessIterator = __gnu_cxx::__normal_iterator<Fraction*, std::vector<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, _Traits, _Alloc>&)| /usr/include/c++/4.6/bits/basic_string.h|2522|note: template<class _CharT, class _Traits, class _Alloc> bool std::operator<(const std::basic_string<_CharT, _Traits, _Alloc>&, const _CharT*)| /usr/include/c++/4.6/bits/basic_string.h|2534|note: template<class _CharT, class _Traits, class _Alloc> bool std::operator<(const _CharT*, const std::basic_string<_CharT, _Traits, _Alloc>&)| /usr/include/c++/4.6/bits/stl_vector.h|1290|note: template<class _Tp, class _Alloc> bool std::operator<(const std::vector<_Tp, _Alloc>&, 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>::operator* [with _Iterator = Fraction*, _Container = std::vector<Fraction>, __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, 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, _Traits, _Alloc>&)| /usr/include/c++/4.6/bits/basic_string.h|2522|note: template<class _CharT, class _Traits, class _Alloc> bool std::operator<(const std::basic_string<_CharT, _Traits, _Alloc>&, const _CharT*)| /usr/include/c++/4.6/bits/basic_string.h|2534|note: template<class _CharT, class _Traits, class _Alloc> bool std::operator<(const _CharT*, const std::basic_string<_CharT, _Traits, _Alloc>&)| /usr/include/c++/4.6/bits/stl_vector.h|1290|note: template<class _Tp, class _Alloc> bool std::operator<(const std::vector<_Tp, _Alloc>&, 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 1 from ‘const Fraction’ to ‘Fraction&’| ||=== Build finished: 22 errors, 0 warnings ===|
bool operator<(Fraction& first,Fraction& second)
问题在于您的重载operator<仅接受非常量参数,但是算法试图将对a的常量引用Fraction与容器中的元素进行比较。
operator<
Fraction
由于operator<不修改比较对象的内容,因此应通过const引用来获取它们:
bool operator<(Fraction const & first,Fraction const & second)