Mati1919 Temat założony przez niniejszego użytkownika  | 
Własny Random Access Iterator » 2017-04-06 09:56:49 Witam, mam następujący problem, napisałem własną strukturę danych po której można się swobodnie poruszać dodawać nowe wartości na koniec i początek a także je usuwać. Chciałem też napisać własny iterator swobodny abym mógł korzystać z funkcji typu sort i copy. class Iterator;
  template < typename T > class CustomContainer {          friend class Iterator; public:      private:     enum ERROR_BIT { FALSE_BIT, TRUE_BIT };          struct Node     {         T item;         struct Node * next;         struct Node * previous;              };          Node * front;     Node * rear;          static int total_objects;     size_type items;     ERROR_BIT check;      public:     CustomContainer()         : items( 0 )          , front( nullptr )          , rear( nullptr )          , check( FALSE_BIT )     { total_objects++; }     CustomContainer( size_type size );      CustomContainer( size_type size, T value );      CustomContainer( const CustomContainer & cc );      template < typename Iter >     CustomContainer( Iter begin, Iter end );      template < typename Iter >     CustomContainer( size_type size, Iter item );      ~CustomContainer();           bool push_back( T value );      bool push_front( T value );      bool pop_back();      bool pop_front();           static int getTotalObj() { return total_objects; }     size_type getContainerSize() { return items; }     bool isFull() { if( check == TRUE_BIT ) return true; else return false; }               CustomContainer & operator =( const CustomContainer & cc );           T & operator []( int n );      const T & operator []( int n ) const;           bool operator ==( const CustomContainer & cc );      bool operator !=( const CustomContainer & cc );      bool operator <( const CustomContainer & cc );      bool operator >( const CustomContainer & cc );      bool operator <=( const CustomContainer & cc );      bool operator >=( const CustomContainer & cc );                class Iterator         : public std::iterator < std::random_access_iterator_tag, Node, ptrdiff_t, Node *, Node &>     {     private:         Node * ptr_;     public:         Iterator( CustomContainer < T >::Node * ptr = nullptr )             : ptr_( ptr )         { }         Iterator( const Iterator & i ) = default;         ~Iterator() { }                           bool operator ==( const Iterator & i ) { return( ptr_ == i.ptr_ ); }         bool operator !=( const Iterator & i ) { return( ptr_ != i.ptr_ ); }         bool operator <( const Iterator & i ) { return( ptr_ < i.ptr_ ); }         bool operator >( const Iterator & i ) { return( ptr_ > i.ptr_ ); }         bool operator <=( const Iterator & i ) { return( ptr_ <= i.ptr_ ); }         bool operator >=( const Iterator & i ) { return( ptr_ >= i.ptr_ ); }                           Iterator & operator =( const Iterator & i );          T & operator *();          Iterator & operator ++();          Iterator & operator ++( int );          Iterator & operator --();          Iterator & operator --( int );          Iterator operator +( ptrdiff_t n );          Iterator operator -( ptrdiff_t n );          Iterator & operator +=( ptrdiff_t n );          Iterator & operator -=( ptrdiff_t n );          ptrdiff_t operator -( const Iterator & i );          Iterator & operator []( ptrdiff_t n );      };          Iterator begin() { return front; }     Iterator end() { return rear->next; }      }; Definicji funkcji nie wklejam bo jest zbyt obszerna jednak jeśli któraś będzie potrzebna to nie ma sprawy.  | 
 | 
michal11  | 
» 2017-04-06 09:59:38 A problem masz z czym konkretnie?  | 
 | 
Mati1919 Temat założony przez niniejszego użytkownika  | 
» 2017-04-06 10:04:34 Kiedy chcę użyć przykładowo funkcji sort i jako jej argumenty podaje a.begin() i a.end() dla CustomContainer<int> a to zasypuje mnie ogrom błędów typu No matching function for call to object of type 'std::_1::_less<CustomContainer<int>::Node,CustomContainer<int>::Node>'
  EDIT: Dodam, że każda funkcja była przetestowana i działa tak jak powinna.  | 
 | 
j23  | 
» 2017-04-06 10:41:46 .  | 
 | 
mokrowski  | 
» 2017-04-06 12:19:01 @Mati1919, błąd sugeruje (bo całego kodu nie widzę) że wywołałeś sort(..) z podaniem jedynie begin() i end() i bez funkcji komparatora. Wtedy wybierany jest domyślnie std::less który próbuje porównać elementy wyłuskane z iteratorów. Najprościej... dodaj jako 3 argument w sort(...) lambdę porównującą poprawnie Node lub zaimplementuj less dla Node.  | 
 | 
Mati1919 Temat założony przez niniejszego użytkownika  | 
» 2017-04-06 12:59:11 Rzeczywiście, spróbuje to zrobić jak wrócę do domu.  | 
 | 
Mati1919 Temat założony przez niniejszego użytkownika  | 
» 2017-04-06 19:26:45 Wróciłem, chciałem to zrobić i pierwsze co rzuciło mi się w oczy to wyłuskanie dla klasy iteratora powoduje zwrócenie wartośći typu T co w tym przypadku, który napisałem wyżej oznacza int.   | 
 | 
Monika90  | 
» 2017-04-06 19:32:45 class Iterator     : public std::iterator < std::random_access_iterator_tag, Node, ptrdiff_t, Node *, Node &> A tu masz Node, a nie T. Poza tym, std::iterator został niedawno zdeprecjonowany.  | 
 | 
|  « 1 »  2 |