【问题标题】:boost::iterator_range from a templated iteratorboost::iterator_range 来自模板化迭代器
【发布时间】:2012-11-01 22:51:32
【问题描述】:

我正在尝试为 Boost::Range 编写 Python itertools.tee 的 C++ 版本(如 here 所示)。这是我的第一次尝试:

template<typename R>
class tee_iterator : std::iterator<std::forward_iterator_tag, typename boost::range_value<R>::type>
{
public:
    typedef typename boost::range_value<R>::type T;
    typedef std::list<T> tee_queue;
    typedef std::vector<tee_queue> tee_queue_collection;

    tee_iterator(const R& r, tee_queue* q, tee_queue_collection* qs) :
        it_(r.begin()), queue_(q), queues_(qs) {}

    tee_iterator(const R& r) : it_(r.end()), queue_(NULL), queues_(NULL) {}

    T& operator*() const { return current_; }

    tee_iterator& operator++()
        {
            if (queue_->empty()) {
                ++it_;
                for (auto q : queues_) {
                    q->push_back(*it_);
                }
            }
            current_ = queue_->front();
            queue_->pop_front();
            return *this;
        }

    bool operator==(tee_iterator const& o) const { return it_ == o.it_; }
    bool operator!=(tee_iterator const& o) const { return !(*this == o); }

private:
    typedef typename boost::range_iterator<const R>::type const_iterator;
    const_iterator it_;
    tee_queue* queue_;
    tee_queue_collection* queues_;
    T current_;
};

template<typename R>
using tee_range = boost::iterator_range<tee_iterator<R> >;

template<typename R>
std::list<tee_range<R> > tee(const R& r, int n)
{
    typedef typename boost::range_value<R>::type T;
    typedef std::list<T> tee_queue;
    typedef std::vector<tee_queue> tee_queue_collection;

    tee_queue_collection queues(n);
    std::list<tee_range<R> > ranges;
    for (int i = 0; i < n; ++i) {
        tee_range<R> t = { tee_iterator<R>(r, &queues[i], &queues), tee_iterator<R>(r) };
        ranges.push_back(t);
    }
    return ranges;
}

但是一旦我尝试使用它:

int main(int argc, char* argv[])
{
    std::list<int> l;
    for (int i = 0; i < 10; ++i) {
        l.push_back(i);
    }
    auto t = tee(l, 3);
}

它吹在我脸上,抱怨boost::detail::iterator_traits&lt;tee_iterator&lt;std::list&lt;int, std::allocator&lt;int&gt; &gt; &gt; &gt;(和其他人)中缺少value_type。我错过了什么? tee_iteratorstd::iterator 的孩子还不够吗?

【问题讨论】:

  • 您确定不是因为您忘记在class tee_iterator : public std::iterator... 之前添加public
  • 哦,真可惜 :) - 我有一个来自 struct 的生成器,当我把它变成 class 时忘记添加 public。想要这样回答吗? :)

标签: c++ boost boost-range


【解决方案1】:

你忘了加public

class tee_iterator : public std::iterator...

【讨论】:

    猜你喜欢
    • 2012-04-27
    • 1970-01-01
    • 1970-01-01
    • 2012-06-24
    • 2018-04-27
    • 1970-01-01
    • 2012-10-29
    • 2012-10-28
    • 2016-06-18
    相关资源
    最近更新 更多