Algorytm sortowania C ++ nie widzi mojego przeciążonego operatora „<” dla typu zdefiniowanego przez użytkownika.
Ok, więc mam 1 typ zdefiniowany przez użytkownikafraction
i reprezentuje i zwykłą część z licznikiem i mianownikiem. Oto kod:
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;}
};
Jak widać, jest on całkowicie zaimplementowany w pliku nagłówkowym.
Tak więc chcę z tym posortować wektor ułamków za pomocą algorytmu sortowania. Oto kod przeciążonego operatora „<” (uwaga: jest umieszczony w tym samym pliku co klasa Fraction, ale poza klasą):
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;
}
Sprawdza, czy mianowniki są równe, jeśli są, to sprawdza wartości liczników. Jeśli nie są równe, wyrównuje je przy użyciu najmniejszej wspólnej wielokrotności i gcd.
Prawdziwy problem zaczyna się, gdy chcę użyć algorytmu sortowania w głównym (błąd kompilacji). Oto główny kod:
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;
}
Błędy, które dostaję, są (Uwaga: mam poprawnie przeciążony operator „<<” dla ułamków, ale nie chcę tu robić bałaganu):
/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 ===|