std::vector<bool>::iterator doesn't meets random iterator requirements
----------------------------------------------------------------------
Key: STDCXX-972
URL: https://issues.apache.org/jira/browse/STDCXX-972
Project: C++ Standard Library
Issue Type: Bug
Components: 23. Containers
Affects Versions: 4.2.1, 4.2.0, 4.1.4, 4.1.3, 4.1.2
Environment: All
Reporter: Farid Zaripov
Fix For: 4.2.2
The test below fails to compile.
{code:title=test.cpp}
#include <vector>
typedef std::vector<bool> VecBool;
typedef VecBool::iterator VecBoolIter;
typedef VecBool::const_iterator VecBoolCIter;
int main ()
{
VecBool vb;
VecBoolIter it = vb.begin ();
VecBoolCIter cit = vb.begin ();
5 + it;
5 + cit;
return 0;
}
{code}
{noformat}
test.cpp(13) : error C2784: 'std::reverse_iterator<_Iterator> std::operator
+(iterator_traits<_Iterator>::difference_type,const
std::reverse_iterator<_Iterator> &)' : could not deduce template argument for
'const std::reverse_iterator<_Iterator> &' from 'VecBoolCIter'
include/rw/_iterator.h(274) : see declaration of 'std::operator +'
test.cpp(13) : error C2784: 'std::reverse_iterator<_Iterator> std::operator
+(iterator_traits<_Iterator>::difference_type,const
std::reverse_iterator<_Iterator> &)' : could not deduce template argument for
'const std::reverse_iterator<_Iterator> &' from 'VecBoolCIter'
include/rw/_iterator.h(274) : see declaration of 'std::operator +'
test.cpp(13) : error C2784: 'std::reverse_iterator<_Iterator> std::operator
+(iterator_traits<_Iterator>::difference_type,const
std::reverse_iterator<_Iterator> &)' : could not deduce template argument for
'const std::reverse_iterator<_Iterator> &' from 'VecBoolCIter'
include/rw/_iterator.h(274) : see declaration of 'std::operator +'
test.cpp(13) : error C2784:
'__rw::__rw_debug_iter<_Container,_Iterator,_MutableIterator> std::operator
+(_Cont::difference_type,const
__rw::__rw_debug_iter<_Container,_Iterator,_MutableIterator> &)' : could not
deduce template argument for 'const
__rw::__rw_debug_iter<_Container,_Iterator,_MutableIterator> &' from
'VecBoolCIter'
include/rw/_iterbase.h(594) : see declaration of 'std::operator +'
test.cpp(13) : error C2784:
'__rw::__rw_debug_iter<_Container,_Iterator,_MutableIterator> std::operator
+(_Cont::difference_type,const
__rw::__rw_debug_iter<_Container,_Iterator,_MutableIterator> &)' : could not
deduce template argument for 'const
__rw::__rw_debug_iter<_Container,_Iterator,_MutableIterator> &' from
'VecBoolCIter'
include/rw/_iterbase.h(594) : see declaration of 'std::operator +'
test.cpp(13) : error C2784:
'__rw::__rw_debug_iter<_Container,_Iterator,_MutableIterator> std::operator
+(_Cont::difference_type,const
__rw::__rw_debug_iter<_Container,_Iterator,_MutableIterator> &)' : could not
deduce template argument for 'const
__rw::__rw_debug_iter<_Container,_Iterator,_MutableIterator> &' from
'VecBoolCIter'
include/rw/_iterbase.h(594) : see declaration of 'std::operator +'
test.cpp(13) : error C2677: binary '+' : no global operator found which takes
type 'VecBoolCIter' (or there is no acceptable conversion)
test.cpp(14) : error C2784: 'std::reverse_iterator<_Iterator> std::operator
+(iterator_traits<_Iterator>::difference_type,const
std::reverse_iterator<_Iterator> &)' : could not deduce template argument for
'const std::reverse_iterator<_Iterator> &' from 'VecBoolIter'
include/rw/_iterator.h(274) : see declaration of 'std::operator +'
test.cpp(14) : error C2784: 'std::reverse_iterator<_Iterator> std::operator
+(iterator_traits<_Iterator>::difference_type,const
std::reverse_iterator<_Iterator> &)' : could not deduce template argument for
'const std::reverse_iterator<_Iterator> &' from 'VecBoolIter'
include/rw/_iterator.h(274) : see declaration of 'std::operator +'
test.cpp(14) : error C2784: 'std::reverse_iterator<_Iterator> std::operator
+(iterator_traits<_Iterator>::difference_type,const
std::reverse_iterator<_Iterator> &)' : could not deduce template argument for
'const std::reverse_iterator<_Iterator> &' from 'VecBoolIter'
include/rw/_iterator.h(274) : see declaration of 'std::operator +'
test.cpp(14) : error C2784:
'__rw::__rw_debug_iter<_Container,_Iterator,_MutableIterator> std::operator
+(_Cont::difference_type,const
__rw::__rw_debug_iter<_Container,_Iterator,_MutableIterator> &)' : could not
deduce template argument for 'const
__rw::__rw_debug_iter<_Container,_Iterator,_MutableIterator> &' from
'VecBoolIter'
include/rw/_iterbase.h(594) : see declaration of 'std::operator +'
test.cpp(14) : error C2784:
'__rw::__rw_debug_iter<_Container,_Iterator,_MutableIterator> std::operator
+(_Cont::difference_type,const
__rw::__rw_debug_iter<_Container,_Iterator,_MutableIterator> &)' : could not
deduce template argument for 'const
__rw::__rw_debug_iter<_Container,_Iterator,_MutableIterator> &' from
'VecBoolIter'
include/rw/_iterbase.h(594) : see declaration of 'std::operator +'
test.cpp(14) : error C2784:
'__rw::__rw_debug_iter<_Container,_Iterator,_MutableIterator> std::operator
+(_Cont::difference_type,const
__rw::__rw_debug_iter<_Container,_Iterator,_MutableIterator> &)' : could not
deduce template argument for 'const
__rw::__rw_debug_iter<_Container,_Iterator,_MutableIterator> &' from
'VecBoolIter'
include/rw/_iterbase.h(594) : see declaration of 'std::operator +'
test.cpp(14) : error C2677: binary '+' : no global operator found which takes
type 'VecBoolIter' (or there is no acceptable conversion)
{noformat}
The proposed fix:
{noformat}
Index: include/vector
===================================================================
--- include/vector (revision 670160)
+++ include/vector (working copy)
@@ -956,6 +956,11 @@
reference operator[] (difference_type __i) {
return *(*this + __i);
}
+
+ friend inline iterator operator+ (difference_type __n,
+ const iterator &__x) {
+ return __x + __n;
+ }
};
class const_iterator
@@ -1025,6 +1030,11 @@
const_reference operator[] (difference_type __i) {
return *(*this + __i);
}
+
+ friend inline const_iterator operator+ (difference_type __n,
+ const const_iterator &__x) {
+ return __x + __n;
+ }
};
#ifndef _RWSTD_NO_CLASS_PARTIAL_SPEC
{noformat}
--
This message is automatically generated by JIRA.
-
You can reply to this email to add a comment to the issue online.