STL iterators in gcc 3.2
Moore, Mathew L
MooreML@BATTELLE.ORG
Fri Oct 25 08:43:00 GMT 2002
>
> 1.- Whereas I didn't need it before, now I have to use the "using
> namespace std" directive if I want to use cout, cin,... and all this
> stuff. Why the change?
>
This version of gcc (and g++) is more standards compliant, hence the new
necessity of std:: when using the iostreams and other standard library
features.
> 2.- This is more serious. In my programs I use a lot of STL
> vectors, and
> so, iterators too. When I had a method with a pointer
> argument, I passed a
> random iterator to it. It worked fine with previous versions
> of gcc, but
> not with 3.2. Is there any way to get it work or do I have to
> come back to
> an older version?
>
>From what I've noticed, the old 2.95 implemented std::vector iterators as
just plain pointers (|std::vector<double>| used |double*|'s for iteration).
It looks like now the library is using class abstractions for its iterators.
This has many benefits, but it also means that some code, e.g.,
void foo(double*);
std::vector<double> myvect;
foo(myvect.begin());
will no longer work, since |myvect.begin()| does not necessarily produce a
double*.
I have found in order to make your code independent of the iterator object,
you have to either use templates,
template <typename OutputIterator>
void foo(OutputIterator);
or you must specifically use the iterator type defined by your container,
void foo(std::vector<double>::iterator);
I don't know if there is an easier conversion than either of these, but I
would be interested in hearing any other ideas.
--Matt
More information about the Gcc-help
mailing list