Boost logo

Boost Users :

Subject: Re: [Boost-users] boost::iterator_facade and assignment operation
From: Arun Ramasamy (aramasamy_at_[hidden])
Date: 2011-10-12 11:32:16


Thanks David. Here's some sample test code:

#include <vector>
#include <boost/iterator/iterator_facade.hpp>

class IntVolume{
public:
     class Iterator : public boost::iterator_facade<Iterator, int,
         boost::bidirectional_traversal_tag>{
     protected:
         Iterator(IntVolume& v):volume(v),pos(0){}
         void increment(){pos++;}
         void decrement(){pos--;}
         bool equal(const Iterator& rhs)const{return pos == rhs.pos;}
         int& dereference()const{ return volume.voxels.at(pos);}
         void advance(ptrdiff_t n){pos+=(int)n;}
         ptrdiff_t distance_to(const Iterator& rhs)const{return
pos-rhs.pos;}
         friend class IntVolume;
         friend class boost::iterator_core_access;
     //private data
         IntVolume& volume;
         int pos;

     };

     Iterator begin(){return Iterator(*this);}
     Iterator end(){
         Iterator iter(*this);
         iter+=100; //assume end is at the 100th element
         return iter;
     }
private:
     std::vector<int> voxels;
};

void TestIntVolume(){
     IntVolume iv;
     IntVolume::Iterator iter = iv.begin();
     iter += 10;
     iter = iv.begin(); //This fails throwing compiler error, everything
else is fine
}

I just tried this code and this throws error in the line I've indicated.
I'm using Boost version 1.44 and vc80 platform toolset in Visual Stdio.
Let me know what you think.
thanks AR

On 10/12/2011 10:38 AM, Dave Abrahams wrote:
> on Wed Oct 12 2011, Arun Ramasamy<aramasamy-AT-thevisualmd.com> wrote:
>
>> HI,
>> I'm using the boost iterator_facade class to implement a random
>> access iterator for my class. When I try to assign the iterators to
>> one another, the compiler fails saying
>>
>> 'operator =' function is unavailable".
>>
>> Sample code from my implementation below:
>>
>> class MyClass{
>> class Iterator : public boost::iterator_facade<Iterator, T,
>> boost::bidirectional_traversal_tag>{ protected:
>> void increment();
>> bool equal(const Iterator& rhs)const; //etc
>> //... Note - no method implemented to support assignment
>> }
>> }
>>
>> I'd assumed that it'll be possible to assign iterators to each other.
>> Why is the assignment operator not supported by iterator_facade.
> It is. My first guess is that you have added a data member with a
> private operator=, but there isn't enough information in your post to be
> sure. I suggest you:
>
> a) reduce the problem to a *minimal* example that demonstrates the
> problem.
>
> b) post the example and the *full* error message here.
>
>

-- 


Boost-users list run by williamkempf at hotmail.com, kalb at libertysoft.com, bjorn.karlsson at readsoft.com, gregod at cs.rpi.edu, wekempf at cox.net