issues with const and iterator

H

hweekuan

i am using some code from a library in which i do not want to edit.
building on the library i have some compile time errors about
assigning iterators. below is the distilled code and error message.
appreciate your help:

1 #include <vector>
2 // --------------------------------------
3 // struct B cannot be edited
4 // --------------------------------------
5 template<class D>
6 struct B {
7
8 B(): data(5) { }
9 const D& get() const { return data; }
10 D data;
11 };
12 // --------------------------------------
13 // edit struct C to make the code compile
14 // --------------------------------------
15 struct C {
16
17 typedef std::vector<int> D;
18 typedef D::iterator Ditr;
19
20 C () {
21 bd = new B<D>();
22 begin_itr = (bd->get()).begin(); // error happens here
23 }
24 Ditr begin_itr;
25 B<D> * bd;
26 };
27 // --------------------------------------
28 int main ( ) { }


g++ -Wall vector_t.C
vector_t.C: In constructor ‘C::C()’:
vector_t.C:22: error: no match for ‘operator=’ in ‘((C*)this)-
C::begin_itr = ((const std::vector<int, std::allocator<int> >*)
((C*)this)->C::bd-> B<D>::get [with D = std::vector<int,
std::allocator<int> >]())->std::vector<_Tp, _Alloc>::begin [with _Tp =
int, _Alloc = std::allocator<int>]()’
/usr/include/c++/4.2.1/bits/stl_iterator.h:637: note: candidates are:
__gnu_cxx::__normal_iterator<int*, std::vector<int,
std::allocator<int> > >& __gnu_cxx::__normal_iterator<int*,
std::vector<int, std::allocator<int> > >::eek:perator=(const
__gnu_cxx::__normal_iterator<int*, std::vector<int,
std::allocator<int> > >&)
 
I

Ian Collins

i am using some code from a library in which i do not want to edit.
building on the library i have some compile time errors about
assigning iterators. below is the distilled code and error message.
appreciate your help:

Answer at the end!
1 #include<vector>
2 // --------------------------------------
3 // struct B cannot be edited
4 // --------------------------------------
5 template<class D>
6 struct B {
7
8 B(): data(5) { }
9 const D& get() const { return data; }

Returns a const object.
10 D data;
11 };
12 // --------------------------------------
13 // edit struct C to make the code compile
14 // --------------------------------------
15 struct C {
16
17 typedef std::vector<int> D;
18 typedef D::iterator Ditr;
19
20 C () {
21 bd = new B<D>();
22 begin_itr = (bd->get()).begin(); // error happens here

(bd->get()).begin() returns a const_iterator.
23 }
24 Ditr begin_itr;
25 B<D> * bd;
26 };
27 // --------------------------------------
28 int main ( ) { }

Line numbers in Usenet posts are a bad idea if you want people to try
your code!
g++ -Wall vector_t.C
vector_t.C: In constructor ‘C::C()’:
vector_t.C:22: error: no match for ‘operator=’ in ‘((C*)this)-
C::begin_itr = ((const std::vector<int, std::allocator<int> >*)
((C*)this)->C::bd-> B<D>::get [with D = std::vector<int,
std::allocator<int> >]())->std::vector<_Tp, _Alloc>::begin [with _Tp =
int, _Alloc = std::allocator<int>]()’
/usr/include/c++/4.2.1/bits/stl_iterator.h:637: note: candidates are:
__gnu_cxx::__normal_iterator<int*, std::vector<int,
std::allocator<int> > >& __gnu_cxx::__normal_iterator<int*,
std::vector<int, std::allocator<int> > >::eek:perator=(const
__gnu_cxx::__normal_iterator<int*, std::vector<int,
std::allocator<int> > >&)

In it's own ridiculously long winded way, g++ is telling you you can't
assign a const iterator to an iterator!
 
J

James Kanze

On 09/ 6/11 09:46 PM, (e-mail address removed) wrote:
[...]
Line numbers in Usenet posts are a bad idea if you want people to try
your code!

But they're a good idea if you're also posting error messages,
so that people can find the line the message is referring to.
(And it doesn't require any real effort to remove them if you
want to try the code.)
 
I

Ian Collins

On 09/ 6/11 09:46 PM, (e-mail address removed) wrote:
[...]
Line numbers in Usenet posts are a bad idea if you want people to try
your code!

But they're a good idea if you're also posting error messages,
so that people can find the line the message is referring to.

He added a comment:

22 begin_itr = (bd->get()).begin(); // error happens here
(And it doesn't require any real effort to remove them if you
want to try the code.)

If you want help, make it easy.
 
R

red floyd

On 09/ 6/11 09:46 PM, (e-mail address removed) wrote:
[...]
Line numbers in Usenet posts are a bad idea if you want people to try
your code!

But they're a good idea if you're also posting error messages,
so that people can find the line the message is referring to.

He added a comment:

22 begin_itr = (bd->get()).begin(); // error happens here
(And it doesn't require any real effort to remove them if you
want to try the code.)

If you want help, make it easy.

And even better is:

begin_itr = (bd->get()).begin(); // LINE 22 - error happens here
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

Forum statistics

Threads
473,769
Messages
2,569,582
Members
45,059
Latest member
cryptoseoagencies

Latest Threads

Top