This is the mail archive of the libstdc++@gcc.gnu.org mailing list for the libstdc++ project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

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.



Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]