Boost logo

Boost Users :

Subject: [Boost-users] Pushing iterators to far?
From: Simon Knapp (sleepingwell_at_[hidden])
Date: 2013-01-10 05:07:37


Hi All,

I'm trying to do some slightly hooky stuff with the iterators library and
cannot get the following code to compile.

When the second last line of main is uncommented ("ZIter iter(b);"),
compilation fails.

The error mesages suggest this is a problem with determining the
appropriate traversal category of "ZIter".

Can anyone advise if this is problem with my code, a bug, am I asking too
much of the library, ...?

Cheers,
Simon Knapp.

compiler:
Visual Studio 2008 - version 9.0.30729.1 SP

//----------------------------------------------------------------------------------------------------------------------------
// begin iterator_tests.cpp
//----------------------------------------------------------------------------------------------------------------------------
#include <vector>

#include <boost/iterator/filter_iterator.hpp>
#include <boost/iterator/zip_iterator.hpp>
#include <boost/tuple/tuple.hpp>

typedef std::vector<long long> LLGrid;
typedef std::vector<float> FloatGrid;

typedef LLGrid::const_iterator LLGridIter;
typedef FloatGrid::const_iterator FloatGridIter;

typedef boost::tuples::tuple<LLGridIter, FloatGridIter> IDAndAreaTuple;
typedef boost::zip_iterator<IDAndAreaTuple> IDAndAreaIterator;
typedef std::iterator_traits<IDAndAreaIterator>::reference IDAndAreaRef;

struct Fnctr {
    bool operator()(const IDAndAreaRef ref) const {
        return true;
    }
};

typedef boost::filter_iterator<Fnctr, IDAndAreaIterator> FIter;
typedef boost::tuples::tuple<FloatGridIter, FIter> ZIterTuple;
typedef boost::zip_iterator<ZIterTuple> ZIter;

static ZIterTuple makeZIterTuple(
    Fnctr const& fnctr,
    LLGridIter const& beginIdGrid,
    LLGridIter const& endIdGrid,
    FloatGridIter const& beginAreaGrid,
    FloatGridIter const& endAreaGrid,
    FloatGridIter const& gtgdIter
    ) {
    return
        boost::make_tuple(
            gtgdIter,
            boost::make_filter_iterator(
                fnctr,
                boost::make_zip_iterator(boost::make_tuple(beginIdGrid,
beginAreaGrid)),
                boost::make_zip_iterator(boost::make_tuple(endIdGrid,
endAreaGrid))
            )
        );
}

int main(int argc, char* argv[]) {
    FloatGrid areaMask, regionStat;
    LLGrid regionMask;
    ZIterTuple b(makeZIterTuple(Fnctr(), regionMask.begin(),
regionMask.end(), areaMask.begin(), areaMask.end(), regionStat.begin()));
    //ZIter iter(b);
    return 0;
}
//----------------------------------------------------------------------------------------------------------------------------
// end iterator_tests.cpp
//----------------------------------------------------------------------------------------------------------------------------



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