Groups | Search | Server Info | Keyboard shortcuts | Login | Register [http] [https] [nntp] [nntps]


Groups > comp.lang.c++ > #70971

Re: std::copy with std::ostream_iterator<std::array...>

From Ralf Goertz <me@myprovider.invalid>
Newsgroups comp.lang.c++
Subject Re: std::copy with std::ostream_iterator<std::array...>
Date 2020-01-02 16:10 +0100
Organization A noiseless patient Spider
Message-ID <qul14t$msl$1@dont-email.me> (permalink)
References <qukdjv$fco$1@dont-email.me> <h762c4FgmbdU1@mid.individual.net>

Show all headers | View raw


Am Thu, 2 Jan 2020 12:26:59 +0100
schrieb Bo Persson <bo@bo-persson.se>:

> On 2020-01-02 at 10:37, Ralf Goertz wrote:
> > Hi,
> > 
> > I don't get the problem in the following program. If I use
> > 
> > using Coords=Foo;
> > 
> > everything is okay but with
> > 
> > using Coords=std::array<int,2>
> > 
> > I get bombarded with (for me) undecipherable template errors
> > originating from the std::copy line. Note that without that line it
> > works for both types, so the operator overload "<<" should not be
> > the problem.  
> 
> But it is.  :-)
> 
> Argument dependent lookup will search for an operator in the 
> namespace(s) of the arguments (thus its name :-).
> 
> If you (or a standard algorithm) use an operator<< with two types
> from namespace std (for example, std::ostream and std::array), the
> compiler will look for an operator<< also in namespace std. There are
> lots of them, but none for std::array.
> 
> Your operator is in the global namespace, but std::array is not. So
> that operator will not be found.
> 
> It works for Foo, because the type and the operator are in the same
> namespace.

Thanks for the explanation. I figured as much after having read Paavo's
reply. But two questions remain. First, I thought it would be illegal
(or at least frowned upon) for user code to inject anything into the std
namespace. And what is the difference for the line

std::cout<<*ls.begin()<<std::endl;

(ls being of type std::set<std::array<int,2>>) although I have defined
the operator in the global namespace and both operands are in std (I
guess). Shouldn't the rule you quoted also lead to a lookup failure?

Back to comp.lang.c++ | Previous | Next — Previous in thread | Next in thread | Find similar | Unroll thread


Thread

std::copy with std::ostream_iterator<std::array...> Ralf Goertz <me@myprovider.invalid> - 2020-01-02 10:37 +0100
  Re: std::copy with std::ostream_iterator<std::array...> Paavo Helde <myfirstname@osa.pri.ee> - 2020-01-02 12:27 +0200
  Re: std::copy with std::ostream_iterator<std::array...> Bo Persson <bo@bo-persson.se> - 2020-01-02 12:26 +0100
    Re: std::copy with std::ostream_iterator<std::array...> Ralf Goertz <me@myprovider.invalid> - 2020-01-02 16:10 +0100
      Re: std::copy with std::ostream_iterator<std::array...> James Kuyper <jameskuyper@alumni.caltech.edu> - 2020-01-02 23:13 -0500
        Re: std::copy with std::ostream_iterator<std::array...> Ralf Goertz <me@myprovider.invalid> - 2020-01-03 07:49 +0100
          Re: std::copy with std::ostream_iterator<std::array...> James Kuyper <jameskuyper@alumni.caltech.edu> - 2020-01-03 08:30 -0500
      Re: std::copy with std::ostream_iterator<std::array...> Bo Persson <bo@bo-persson.se> - 2020-01-03 15:09 +0100
  Re: std::copy with std::ostream_iterator<std::array...> Ike Naar <ike@sdf.lonestar.org> - 2020-01-04 21:46 +0000
    Re: std::copy with std::ostream_iterator<std::array...> Ralf Goertz <me@myprovider.invalid> - 2020-01-05 16:06 +0100
      Re: std::copy with std::ostream_iterator<std::array...> Jorgen Grahn <grahn+nntp@snipabacken.se> - 2020-01-05 18:24 +0000
        Re: std::copy with std::ostream_iterator<std::array...> Öö Tiib <ootiib@hot.ee> - 2020-01-05 10:56 -0800
          Re: std::copy with std::ostream_iterator<std::array...> Jorgen Grahn <grahn+nntp@snipabacken.se> - 2020-01-05 19:55 +0000

csiph-web