g++ doesn't recognize a user-defined operator<<(ostream, const pair<int, double> &)
although it recognizes struct A {}; operator<<(ostream, const pair<int, A> &) Regards, Olaf. $ cat gccbug.cpp #include <algorithm> #include <iostream> #include <iterator> #include <map> typedef std::map<int, double> M; extern std::ostream &operator <<(std::ostream &f, const M::value_type &p); void f() { M m; std::copy(m.begin(), m.end(), std::ostream_iterator<M::value_type>(std::cout)); } This one compiles without problems: #include <algorithm> #include <iostream> #include <iterator> #include <map> struct A { double d; }; typedef std::map<int, A> M; extern std::ostream &operator <<(std::ostream &f, const M::value_type &p); void f() { M m; std::copy(m.begin(), m.end(), std::ostream_iterator<M::value_type>(std::cout)); } Putting the operator<<() in namespace std, cirucmvents the compile error too: #include <algorithm> #include <iostream> #include <iterator> #include <map> typedef std::map<int, double> M; namespace std { extern std::ostream &operator <<(std::ostream &f, const M::value_type &p); }; void f() { M m; std::copy(m.begin(), m.end(), std::ostream_iterator<M::value_type>(std::cout)); } And here is the output of the g++ call: $ d:/programme/mingw/bin/g++ -v -c -Wall -save-temps gccbug.cpp Reading specs from d:/programme/mingw/bin/../lib/gcc/i686-pc-mingw32/4.0.2/specs Target: i686-pc-mingw32 Configured with: ../gcc-4.0.2/configure --with-gcc --prefix=/mingw --enable-threads --disable-nls --enable-languages=c,c++ --disable-win32-registry --disable-shared --enable-sjlj-exceptions --without-x --enable-libstdcxx-debug Thread model: win32 gcc version 4.0.2 d:/programme/mingw/bin/../libexec/gcc/i686-pc-mingw32/4.0.2/cc1plus.exe -E -quiet -v -iprefix d:\programme\mingw\bin\../lib/gcc/i686-pc-mingw32/4.0.2/ gccbug.cpp -mtune=pentiumpro -Wall -fpch-preprocess -o gccbug.ii ignoring nonexistent directory "/mingw/include" ignoring nonexistent directory "d:/programme/mingw/i686-pc-mingw32/include" ignoring nonexistent directory "/mingw/include" #include "..." search starts here: #include <...> search starts here: d:/programme/mingw/bin/../lib/gcc/i686-pc-mingw32/4.0.2/include d:/programme/mingw/include/c++/4.0.2 d:/programme/mingw/include/c++/4.0.2/i686-pc-mingw32 d:/programme/mingw/include/c++/4.0.2/backward d:/programme/mingw/include d:/programme/mingw/lib/gcc/i686-pc-mingw32/4.0.2/include End of search list. d:/programme/mingw/bin/../libexec/gcc/i686-pc-mingw32/4.0.2/cc1plus.exe -fpreprocessed gccbug.ii -quiet -dumpbase gccbug.cpp -mtune=pentiumpro -auxbase gccbug -Wall -version -o gccbug.s GNU C++ version 4.0.2 (i686-pc-mingw32) compiled by GNU C version 4.0.2. GGC heuristics: --param ggc-min-expand=99 --param ggc-min-heapsize=129918 d:/programme/mingw/include/c++/4.0.2/bits/stream_iterator.h: In member function 'std::ostream_iterator<_Tp, _CharT, _Traits>& std::ostream_iterator<_Tp, _CharT, _Traits>::operator=(const _Tp&) [with _Tp = std::pair<const int, double>, _CharT = char, _Traits = std::char_traits<char>]': d:/programme/mingw/include/c++/4.0.2/bits/stl_algobase.h:270: instantiated from 'static _OI std::__copy<<anonymous>, <template-parameter-1-2> >::copy(_II, _II, _OI) [with _II = std::_Rb_tree_iterator<std::pair<const int, double> >, _OI = std::ostream_iterator<std::pair<const int, double>, char, std::char_traits<char> >, bool <anonymous> = false, <template-parameter-1-2> = std::bidirectional_iterator_tag]' d:/programme/mingw/include/c++/4.0.2/bits/stl_algobase.h:317: instantiated from '_OI std::__copy_aux(_II, _II, _OI) [with _II = std::_Rb_tree_iterator<std::pair<const int, double> >, _OI = std::ostream_iterator<std::pair<const int, double>, char, std::char_traits<char> >]' d:/programme/mingw/include/c++/4.0.2/bits/stl_algobase.h:326: instantiated from 'static _OI std::__copy_normal<<anonymous>, <anonymous> >::copy_n(_II, _II, _OI) [with _II = std::_Rb_tree_iterator<std::pair<const int, double> >, _OI = std::ostream_iterator<std::pair<const int, double>, char, std::char_traits<char> >, bool <anonymous> = false, bool <anonymous> = false]' d:/programme/mingw/include/c++/4.0.2/bits/stl_algobase.h:387: instantiated from '_OutputIterator std::copy(_InputIterator, _InputIterator, _OutputIterator) [with _InputIterator = std::_Rb_tree_iterator<std::pair<const int, double> >, _OutputIterator = std::ostream_iterator<std::pair<const int, double>, char, std::char_traits<char> >]' gccbug.cpp:12: instantiated from here d:/programme/mingw/include/c++/4.0.2/bits/stream_iterator.h:196: error: no match for 'operator<<' in '*((std::ostream_iterator<std::pair<const int, double>, char, std::char_traits<char> >*)this)->std::ostream_iterator<std::pair<const int, double>, char, std::char_traits<char> >::_M_stream << __value' d:/programme/mingw/include/c++/4.0.2/bits/ostream.tcc:67: note: candidates are: std::basic_ostream<_CharT, _Traits>& std::basic_ostream<_CharT, _Traits>::operator<<(std::basic_ostream<_CharT, _Traits>& (*)(std::basic_ostream<_CharT, _Traits>&)) [with _CharT = char, _Traits = std::char_traits<char>] d:/programme/mingw/include/c++/4.0.2/bits/ostream.tcc:78: note: std::basic_ostream<_CharT, _Traits>& std::basic_ostream<_CharT, _Traits>::operator<<(std::basic_ios<_CharT, _Traits>& (*)(std::basic_ios<_CharT, _Traits>&)) [with _CharT = char, _Traits = std::char_traits<char>] d:/programme/mingw/include/c++/4.0.2/bits/ostream.tcc:90: note: std::basic_ostream<_CharT, _Traits>& std::basic_ostream<_CharT, _Traits>::operator<<(std::ios_base& (*)(std::ios_base&)) [with _CharT = char, _Traits = std::char_traits<char>] d:/programme/mingw/include/c++/4.0.2/bits/ostream.tcc:125: note: std::basic_ostream<_CharT, _Traits>& std::basic_ostream<_CharT, _Traits>::operator<<(long int) [with _CharT = char, _Traits = std::char_traits<char>] d:/programme/mingw/include/c++/4.0.2/bits/ostream.tcc:159: note: std::basic_ostream<_CharT, _Traits>& std::basic_ostream<_CharT, _Traits>::operator<<(long unsigned int) [with _CharT = char, _Traits = std::char_traits<char>] d:/programme/mingw/include/c++/4.0.2/bits/ostream.tcc:102: note: std::basic_ostream<_CharT, _Traits>& std::basic_ostream<_CharT, _Traits>::operator<<(bool) [with _CharT = char, _Traits = std::char_traits<char>] d:/programme/mingw/include/c++/4.0.2/ostream:176: note: std::basic_ostream<_CharT, _Traits>& std::basic_ostream<_CharT, _Traits>::operator<<(short int) [with _CharT = char, _Traits = std::char_traits<char>] d:/programme/mingw/include/c++/4.0.2/ostream:187: note: std::basic_ostream<_CharT, _Traits>& std::basic_ostream<_CharT, _Traits>::operator<<(short unsigned int) [with _CharT = char, _Traits = std::char_traits<char>] d:/programme/mingw/include/c++/4.0.2/ostream:191: note: std::basic_ostream<_CharT, _Traits>& std::basic_ostream<_CharT, _Traits>::operator<<(int) [with _CharT = char, _Traits = std::char_traits<char>] d:/programme/mingw/include/c++/4.0.2/ostream:202: note: std::basic_ostream<_CharT, _Traits>& std::basic_ostream<_CharT, _Traits>::operator<<(unsigned int) [with _CharT = char, _Traits = std::char_traits<char>] d:/programme/mingw/include/c++/4.0.2/bits/ostream.tcc:183: note: std::basic_ostream<_CharT, _Traits>& std::basic_ostream<_CharT, _Traits>::operator<<(long long int) [with _CharT = char, _Traits = std::char_traits<char>] d:/programme/mingw/include/c++/4.0.2/bits/ostream.tcc:218: note: std::basic_ostream<_CharT, _Traits>& std::basic_ostream<_CharT, _Traits>::operator<<(long long unsigned int) [with _CharT = char, _Traits = std::char_traits<char>] d:/programme/mingw/include/c++/4.0.2/bits/ostream.tcc:242: note: std::basic_ostream<_CharT, _Traits>& std::basic_ostream<_CharT, _Traits>::operator<<(double) [with _CharT = char, _Traits = std::char_traits<char>] d:/programme/mingw/include/c++/4.0.2/ostream:217: note: std::basic_ostream<_CharT, _Traits>& std::basic_ostream<_CharT, _Traits>::operator<<(float) [with _CharT = char, _Traits = std::char_traits<char>] d:/programme/mingw/include/c++/4.0.2/bits/ostream.tcc:265: note: std::basic_ostream<_CharT, _Traits>& std::basic_ostream<_CharT, _Traits>::operator<<(long double) [with _CharT = char, _Traits = std::char_traits<char>] d:/programme/mingw/include/c++/4.0.2/bits/ostream.tcc:288: note: std::basic_ostream<_CharT, _Traits>& std::basic_ostream<_CharT, _Traits>::operator<<(const void*) [with _CharT = char, _Traits = std::char_traits<char>] d:/programme/mingw/include/c++/4.0.2/bits/ostream.tcc:311: note: std::basic_ostream<_CharT, _Traits>& std::basic_ostream<_CharT, _Traits>::operator<<(std::basic_streambuf<_CharT, _Traits>*) [with _CharT = char, _Traits = std::char_traits<char>] d:/programme/mingw/include/c++/4.0.2/ostream:447: note: std::basic_ostream<_CharT, _Traits>& std::operator<<(std::basic_ostream<_CharT, _Traits>&, char) [with _CharT = char, _Traits = std::char_traits<char>] d:/programme/mingw/include/c++/4.0.2/bits/ostream.tcc:509: note: std::basic_ostream<char, _Traits>& std::operator<<(std::basic_ostream<char, _Traits>&, char) [with _Traits = std::char_traits<char>] d:/programme/mingw/include/c++/4.0.2/ostream:458: note: std::basic_ostream<char, _Traits>& std::operator<<(std::basic_ostream<char, _Traits>&, signed char) [with _Traits = std::char_traits<char>] d:/programme/mingw/include/c++/4.0.2/ostream:463: note: std::basic_ostream<char, _Traits>& std::operator<<(std::basic_ostream<char, _Traits>&, unsigned char) [with _Traits = std::char_traits<char>] d:/programme/mingw/include/c++/4.0.2/bits/ostream.tcc:571: note: std::basic_ostream<_CharT, _Traits>& std::operator<<(std::basic_ostream<_CharT, _Traits>&, const char*) [with _CharT = char, _Traits = std::char_traits<char>] d:/programme/mingw/include/c++/4.0.2/bits/ostream.tcc:616: note: std::basic_ostream<char, _Traits>& std::operator<<(std::basic_ostream<char, _Traits>&, const char*) [with _Traits = std::char_traits<char>] d:/programme/mingw/include/c++/4.0.2/ostream:497: note: std::basic_ostream<char, _Traits>& std::operator<<(std::basic_ostream<char, _Traits>&, const signed char*) [with _Traits = std::char_traits<char>] d:/programme/mingw/include/c++/4.0.2/ostream:502: note: std::basic_ostream<char, _Traits>& std::operator<<(std::basic_ostream<char, _Traits>&, const unsigned char*) [with _Traits = std::char_traits<char>] -- Summary: g++ doesn't recognize user-defined operator<<(ostream, const pair<int, double> &) Product: gcc Version: 4.0.2 Status: UNCONFIRMED Severity: normal Priority: P3 Component: c++ AssignedTo: unassigned at gcc dot gnu dot org ReportedBy: olaf dot dietsche at gfa-net dot de http://gcc.gnu.org/bugzilla/show_bug.cgi?id=26512