Thorsten Ottosen wrote:
abir basak wrote:
abir basak wrote:
To make the problem little clearer,
typedef boost::circular_buffer<int> cbi;
typedef std::vector<int> vi;
This code works,
boost::sub_range<vi> get_range(vi& v,int from,int to){
return boost::sub_range<vi>(v.begin()+from,v.begin()+to);
}
But this don't.
boost::sub_range<cbi> get_range(cbi& v,int from,int to){
return boost::sub_range<cbi>(v.begin()+from,v.begin()+to);
}
Try to make the example even smaller so you can post it to the list as a
complete example that does not require any additional dependencies.
I will try it out then.
I found a solution in the mean-time. I had just overlooked the
make_iterator_range function, which serves the purpose.
But still I feels some problem is there with the copy ctor of sub_range
(or may be copy ctor of iterator_range ) with Visual Studio 2003 (7.1)
and 2005 (8.0 ) compiler version. All of the example runs perfectly with
MinGW (GCC mingw build 3.4.5 version).
I am trying to give a compilable example.
1)
#include <iterator>
#include <memory>
#include <vector>
#include <iostream>
#include
#include
template<typename T>
class range_vector : public boost::circular_buffer<T>{
public:
typedef boost::sub_range range;
typedef boost::sub_range<const range_vector> const_range;
typedef typename boost::circular_buffer<T>::size_type size_type;
using boost::circular_buffer<T>::begin;
range_vector(size_type capacity) : boost::circular_buffer<T>(capacity){}
range get_range(size_type from,size_type to){
return range(begin()+from,begin()+to);
}
const_range get_range(size_type from,size_type to)const{
return const_range(begin()+from,begin()+to);
}
};
typedef range_vector<int> rvi;
int main() {
rvi v(9);
int x[] = {0,1,2,3,4,5,6,7,8};
v.insert(v.end(),x,x+9);
rvi::range r1(v.get_range(1,5));
///get_range causes error in VS 7.1 & 8.0 problem is likely due to
copy-ctor of sub_range. Works fine on MinGW.
}
VS error is
e:\boost_1_33_1\boost\range\iterator_range.hpp(60): error C2440: 'type
cast' : cannot convert from 'boost::range_iterator<C>::type' to
'boost::range_iterator<C>::type'
with
[
C=const boost::sub_range
]
and
[
C=range_vector<int>
]
Inheriting range_vector from std::vector works fine for both compilers.
2) However changing the range_vector<T> class as below works for both
compiler. Note, here it uses boost::make_iterator_range instead.
template<typename T>
class range_vector : public boost::circular_buffer<T>{
public:
typedef boost::sub_range range;
typedef boost::sub_range<const range_vector> const_range;
typedef typename boost::circular_buffer<T>::size_type size_type;
using boost::circular_buffer<T>::begin;
range_vector(size_type capacity) : boost::circular_buffer<T>(capacity){}
range get_range(size_type from,size_type to){
return boost::make_iterator_range(begin()+from,begin()+to);
}
const_range get_range(size_type from,size_type to)const{
return boost::make_iterator_range(begin()+from,begin()+to);
}
};
Not sure if it is an error. You can check if that one is expected
behavior. But it works with make_iterator_range, which I had overlooked.
Thanks for listening.
abir
-Thorsten
--
Abir Basak, Member IEEE
Software Engineer, Read Ink Technologies
B. Tech, IIT Kharagpur
email: abir@abirbasak.com
homepage: www.abirbasak.com