This is the mail archive of the
libstdc++@gcc.gnu.org
mailing list for the libstdc++ project.
reference type of output_iterator_wrapper
- From: Doug Gregor <dgregor at cs dot indiana dot edu>
- To: libstdc++ at gcc dot gnu dot org
- Date: Mon, 17 Apr 2006 09:55:05 -0400
- Subject: reference type of output_iterator_wrapper
The testsuite_iterators.h header, part of the libstdc++-v3 testsuite,
contains the struct template output_iterator wrapper. In the
definition of this wrapper, the nested "reference" type (defined
through std::iterator) conflicts with the type returned from operator*:
template<class T>
struct output_iterator_wrapper: public std::iterator
<std::output_iterator_tag, T, ptrdiff_t, T*, T&>
{
// ...
WritableObject<T>
operator*() const
{
ITERATOR_VERIFY(ptr < SharedInfo->last);
ITERATOR_VERIFY(SharedInfo->writtento[ptr - SharedInfo->first]
== false);
return WritableObject<T>(ptr, SharedInfo);
}
// ...
};
output_iterator_wrapper<T>::reference is defined to be T&, whereas
operator* returns WritableObject<T>. Sure, you won't find anywhere in
the standard that explicitly says that the "reference" type needs to
be the same as the return type of operator*, but it's implied by the
uses of "reference" (e.g., in reverse_iterator). Anyway, I doubt the
current output_iterator_wrapper would pass a concept checker, and it
fails in ConceptGCC.
I suggest changing the last argument of the std::iterator base to
WritableObject<T>. Patch attached.
Doug
--- testsuite_iterators.h.old 2006-04-17 09:50:07.000000000 -0400
+++ testsuite_iterators.h 2006-04-17 09:50:37.000000000 -0400
@@ -115,7 +115,7 @@
*/
template<class T>
struct output_iterator_wrapper: public std::iterator
- <std::output_iterator_tag, T, ptrdiff_t, T*, T&>
+ <std::output_iterator_tag, T, ptrdiff_t, T*, WritableObject<T> >
{
typedef OutputContainer<T> ContainerType;
T* ptr;
2006-04-17 Douglas Gregor <dgregor@cs.indiana.edu>
* testsuite/testsuite_iterators.h (output_iterator_wrapper):
WritableObject<T> is the reference type.