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


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

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

From Bo Persson <bo@bo-persson.se>
Newsgroups comp.lang.c++
Subject Re: std::copy with std::ostream_iterator<std::array...>
Date 2020-01-02 12:26 +0100
Message-ID <h762c4FgmbdU1@mid.individual.net> (permalink)
References <qukdjv$fco$1@dont-email.me>

Show all headers | View raw


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.

> 
> What ist going on
> 
> #include <iostream>
> #include <iterator>
> #include <algorithm>
> #include <array>
> #include <set>
> 
> struct Foo {
>      int i,j;
>      bool operator<(const struct Foo &r) const { //needed for set
>          if (i<r.i) return true;
>          return j<r.j;
>      }
> };
> 
> std::ostream & operator<<(std::ostream &o,const std::array<int,2> &c) {
>      return o<<'('<<c[0]<<','<<c[1]<<')';
> }
> 
> std::ostream & operator<<(std::ostream &o,const Foo &c) {
>      return o<<'('<<c.i<<','<<c.j<<')';
> }
>                      
> using Coords=Foo;  //this works
> //using Coords=std::array<int,2>; //this doesn't
> 
> int main() {
>      std::set<Coords> ls;
>      ls.insert(Coords({47,11}));
>      std::cout<<*ls.begin()<<std::endl;
>      std::copy(ls.cbegin(),ls.cend(),std::ostream_iterator<Coords>(std::cout," ")); //Compile error with array
>      std::cout<<"\n";
> }
> 

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