Opened 10 years ago
Closed 10 years ago
#8024 closed Bugs (fixed)
Unable to create const_iterator for coroutine
| Reported by: | Nathan Ridge | Owned by: | olli |
|---|---|---|---|
| Milestone: | To Be Determined | Component: | coroutine |
| Version: | Boost 1.53.0 | Severity: | Problem |
| Keywords: | Cc: |
Description
It seems to be impossible to create a const_iterator for a coroutine. For example, the following fails to compile:
#include <boost/coroutine/coroutine.hpp>
typedef boost::coroutines::coroutine<int()> coroutine_type;
void f(coroutine_type::caller_type& c) {}
int main()
{
coroutine_type c(f);
coroutine_type::const_iterator it = boost::begin(c);
}
with the error:
test.cpp: In function 'int main()':
test.cpp:10:55: error: conversion from 'boost::range_iterator<boost::coroutines::coroutine<int()> >::type {aka boost::coroutines::detail::coroutine_op<int(), boost::coroutines::coroutine<int()>, int, 0>::iterator}' to non-scalar type 'boost::coroutines::detail::coroutine_op<int(), boost::coroutines::coroutine<int()>, int, 0>::const_iterator' requested
Change History (3)
comment:1 by , 10 years ago
| Resolution: | → fixed |
|---|---|
| Status: | new → closed |
comment:2 by , 10 years ago
| Resolution: | fixed |
|---|---|
| Status: | closed → reopened |
What I'm really trying to get to work is code like the following:
#include <iostream>
#include <boost/coroutine/coroutine.hpp>
typedef boost::coroutines::coroutine<int()> coro_t;
void foo(coro_t::caller_type& caller)
{
caller(0);
caller(1);
caller(2);
}
coro_t f()
{
return coro_t(&foo);
}
template <typename Range>
void print_range(const Range& range)
{
for (auto element : range)
std::cout << element;
}
int main()
{
print_range(f());
}
The C++11 range-based for loop requires either that the range type have a member function named 'begin', or that there exist a non-member function named 'begin' that is found by argument-dependent lookup (i.e. in the same namespace as the range type). In either case, the 'begin' function should have a const version that returns a const iterator.
What that translates to for coroutines is that either coroutine needs to have a member function with the signature "begin() const" or there needs to be a non-member function named "begin" in "boost::coroutines" that takes a "const coroutine&" parameter. (And of course the same for 'end').

small fix in code but use 'boost::const_begin()' to create an const_iterator, please