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
//----------------------------------------------------------------------------------------------------------------------------