Moved from Rogue Wave Bugzilla:
http://bugzilla.cvo.roguewave.com/show_bug.cgi?id=1923
-------- Original Message --------
Subject: Re: FWD: Peren 6.4 and N + iterator & swap(deque, deque)
Date: Mon, 18 Apr 2005 18:12:41 -0700 (PDT)
From: Dennis Handly <dhandly@cup.hp.com>
To: dhandly@cup.hp.com, sebor@roguewave.com
CC: Boris.Gubenko@hp.com, mahesha@india.hp.com, sgganesh@india.hp.com
>From: Dennis Handly <dhandly@cup.hp.com>
>Or use deque directly:
template <class _TypeT, class _Allocator>
inline typename deque<_TypeT, _Allocator>::iterator
operator+(typename deque<_TypeT,
_Allocator>::iterator::difference_type __n,
typename deque<_TypeT, _Allocator>::iterator __rhs)
{
return _rhs.operator+(_n);
}
This didn't work. I need to also have one for const_iterator.
And it seems the test is bad:
error #2349: no operator "+" matches these operands
operand types are: int + std::deque<char,
std::allocator<char>>::const_iterator
2+it04
^
24(9) says that "n denotes a value of difference type Distance".
So that this has to be "2L". Or better yet:
...:iterator::difference_type(2) + it04
Does this seem like something we can get Perennial to change?
Boris:
Do we know how those other STLs work? Do they have an extra int
overloading?
------- Additional Comments From sebor@roguewave.com 2005-04-19 09:30:12 ----
-------- Original Message --------
Subject: Re: FWD: Peren 6.4 and N + iterator & swap(deque, deque)
Date: Tue, 19 Apr 2005 10:29:32 -0600
From: Martin Sebor <sebor@roguewave.com>
To: Dennis Handly <dhandly@cup.hp.com>
CC: Boris.Gubenko@hp.com, mahesha@india.hp.com, sgganesh@india.hp.com
References: <200504190112.SAA17097@hpcll183.cup.hp.com>
Dennis Handly wrote:
>>From: Dennis Handly <dhandly@cup.hp.com>
>>Or use deque directly:
>
> template <class _TypeT, class _Allocator>
> inline typename deque<_TypeT, _Allocator>::iterator
> operator+(typename deque<_TypeT,
_Allocator>::iterator::difference_type __n,
> typename deque<_TypeT, _Allocator>::iterator __rhs)
> {
> return __rhs.operator+(__n);
> }
>
> This didn't work. I need to also have one for const_iterator.
>
> And it seems the test is bad:
> error #2349: no operator "+" matches these operands
> operand types are: int + std::deque<char,
> std::allocator<char>>::const_iterator
> 2+it04
> ^
>
> 24(9) says that "n denotes a value of difference type Distance".
Ah. That's because the type of 2 is int but deque iterator's
distance type (that the iterator's type depends on) is long.
Darn! Those templates, they always get you! I'll have to think
about this one some more. I created bug 1923 to remind me.
>
> So that this has to be "2L". Or better yet:
> ...:iterator::difference_type(2) + it04
>
> Does this seem like something we can get Perennial to change?
Strictly speaking I think the test is incorrect. 24.1, p1 says
that n (used in Table 76) denotes a value of the difference type
Distance, but 2 is not. But as a matter of QoI any integer should
work.
Martin
------- Additional Comments From sebor@roguewave.com 2005-04-19 09:31:08 ----
Here's the test case:
$ cat t.cpp && aCC -AA -V -c t.cpp
#include <deque>
void foo (std::deque<char>::const_iterator i)
{
i + 2;
2 + i;
}
aCC: HP aC++/ANSI C B3910B A.06.00 [Aug 25 2004]
"t.cpp", line 6: error #2349: no operator "+" matches these operands
operand types are: int + std::deque<char,
std::allocator<char>>::const_iterator
2 + i;
^
1 error detected in the compilation of "t.cpp".