Re: ostream_iterator for map
On 2012-04-13 04:46, James K. Lowden wrote:
I feel like I've asked this question before, but if so I can't find
it and still don't get it, so here goes....
Yes, this issue occurs once in a while.
I want to copy a std::map to std::cout. I define operator<< for the
map's value_type. I can use that operator by defererencing a the
map's iterator. Why can't I compile std::copy with
ostream_iterator?
The program that follows compiles and runs as is. Change it to #if
0 instead, and get "no match for 'operator<<' ". g++ says there are
many candidates, all standard, none mine.
The whole "no match" error is:
/usr/include/g++/bits/stream_iterator.h:196: error: no match for
'operator<<' in '*((std::ostream_iterator<std::pair<const int,
float>, char, std::char_traits<char> >*)
this)->std::ostream_iterator<std::pair<const int, float>, char,
std::char_traits<char> >::_M_stream<< __value'
Many thanks for your insight.
ADL name-lookup wont find your operator<< overload, because it only
looks in namespace std, but your operator<< overload for std::pair is
not part of this namespace. According to the library requirements,
user-code shall not add any components (except template
specializations with at least one user-defined type) to namespace std.
The only portable way to realize this use-case is to
a) Provide an io wrapper for the wanted library-component(s)
b) Use std::transform instead of std::copy.
Put it all together, this may look like so:
template<class T1, class T2>
struct pair_io {
const std::pair<T1, T2>& p;
pair_io(const std::pair<T1, T2>& p) : p(p) {}
};
template<class T1, class T2>
inline
pair_io<T1, T2> io(const std::pair<T1, T2>& p) { return pair_io<T1,
T2>(p); }
template<class T1, class T2>
inline
ostream& operator<<( ostream& os, const pair_io<T1, T2>& value )
{
return os << "(" << value.p.first << ", " << value.p.second << ")";
}
and at the call point:
std::transform( m.begin(), m.end(),
ostream_iterator<pair_io<int, float> >(cout, "\n"),
io<int, float>);
HTH & Greetings from Bremen,
Daniel Kr??gler
--
[ See http://www.gotw.ca/resources/clcm.htm for info about ]
[ comp.lang.c++.moderated. First time posters: Do this! ]