This is the mail archive of the gcc-bugs@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

typedef of pair<> != pair<> in copy(); have to define pair<> derived class


It seems like the following should compile (with USE_TYPEDEF=1), since a
typedef of a std::pair<> class should be equivalent to the std::pair<>
class.  To get it to compile, I had to declare a std::pair<> derived struct.
Is this a compiler bug or pilot error on my part?

Mike

/*
Compile with GNU g++ 3.2 "g++ -c -DUSE_TYPEDEF typedef_bug.cpp" fails.
Compile with GNU g++ 3.2 "g++ -c -DUSE_TYPEDEF=0 typedef_bug.cpp" works.

It also fails with recent snapshots of 3.3 and 3.4.
 */
#include <iostream>
#include <string>
#include <memory>
#include <set>
#include <algorithm>
#include <iterator>

using namespace std;

#if USE_TYPEDEF
// Use the par<> typedef, compile error.
typedef pair<string, int> Pathname;

#else
// Use the pair<>-derived struct, compilation succeeds.
struct Pathname: public pair<string, int>
{
  Pathname() {}
  Pathname(string &s, int i): pair<string, int>(s, i) {}
};

#endif

// Read string pair from an input stream.
istream &operator>>(istream &in, Pathname &sp)
{
  in >> sp.first >> sp.second;
  return in;
}

// Write string pair to output stream.
ostream &operator<<(ostream &out, const Pathname &sp)
{
  out << sp.first << " " << sp.second;
  return out;
}

int
main()
{
  set<Pathname> unique;

  ostream_iterator<Pathname> out_iterator(cout, ":");
  copy(unique.begin(), unique.end(), out_iterator);
}
/*
/usr/include/c++/3.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 = Pathname, _CharT =
char,
   _Traits = std::char_traits<char>]':
/usr/include/c++/3.2/bits/stl_algobase.h:228:   instantiated from
`_OutputIter std::__copy(_InputIter, _InputIter, _OutputIter,
std::input_iterator_tag) [with _InputIter = std::_Rb_tree_iterator<Pathname,
const Pathname&, const Pathname*>, _OutputIter =
std::ostream_iterator<Pathname, char, std::char_traits<char> >]'
/usr/include/c++/3.2/bits/stl_algobase.h:260:   instantiated from
`_OutputIter std::__copy_aux2(_InputIter, _InputIter, _OutputIter,
__false_type) [with _InputIter = std::_Rb_tree_iterator<Pathname, const
Pathname&, const Pathname*>, _OutputIter = std::ostream_iterator<Pathname,
char, std::char_traits<char> >]'
/usr/include/c++/3.2/bits/stl_algobase.h:303:   instantiated from
`_OutputIter std::__copy_ni2(_InputIter, _InputIter, _OutputIter,
__false_type) [with _InputIter = std::_Rb_tree_iterator<Pathname, const
Pathname&, const Pathname*>, _OutputIter = std::ostream_iterator<Pathname,
char, std::char_traits<char> >]'
/usr/include/c++/3.2/bits/stl_algobase.h:323:   instantiated from
`_OutputIter std::__copy_ni1(_InputIter, _InputIter, _OutputIter,
__false_type) [with _InputIter = std::_Rb_tree_iterator<Pathname, const
Pathname&, const Pathname*>, _OutputIter = std::ostream_iterator<Pathname,
char, std::char_traits<char> >]'
/usr/include/c++/3.2/bits/stl_algobase.h:349:   instantiated from
`_OutputIter std::copy(_InputIter, _InputIter, _OutputIter) [with _InputIter
= std::_Rb_tree_iterator<Pathname, const Pathname&, const Pathname*>,
_OutputIter = std::ostream_iterator<Pathname, char, std::char_traits<char>
>]'
typedef_bug.cpp:50:   instantiated from here

Why doesn't the compiler use the I/O stream operators defined above?

/usr/include/c++/3.2/bits/stream_iterator.h:141: no match for `
   std::basic_ostream<char, std::char_traits<char> >& << const
   std::pair<std::string, int>&' operator
/usr/include/c++/3.2/bits/ostream.tcc:55: 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>]
/usr/include/c++/3.2/bits/ostream.tcc:77:
   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>]
/usr/include/c++/3.2/bits/ostream.tcc:99:
   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>]
/usr/include/c++/3.2/bits/ostream.tcc:171:
   std::basic_ostream<_CharT, _Traits>& std::basic_ostream<_CharT,
   _Traits>::operator<<(long int) [with _CharT = char, _Traits =
   std::char_traits<char>]
/usr/include/c++/3.2/bits/ostream.tcc:208:
   std::basic_ostream<_CharT, _Traits>& std::basic_ostream<_CharT,
   _Traits>::operator<<(long unsigned int) [with _CharT = char, _Traits =
   std::char_traits<char>]
/usr/include/c++/3.2/bits/ostream.tcc:146:
   std::basic_ostream<_CharT, _Traits>& std::basic_ostream<_CharT,
   _Traits>::operator<<(bool) [with _CharT = char, _Traits =
   std::char_traits<char>]
/usr/include/c++/3.2/ostream:104:                 std::basic_ostream<_CharT,
   _Traits>& std::basic_ostream<_CharT, _Traits>::operator<<(short int)
[with
   _CharT = char, _Traits = std::char_traits<char>]
/usr/include/c++/3.2/ostream:115:                 std::basic_ostream<_CharT,
   _Traits>& std::basic_ostream<_CharT, _Traits>::operator<<(short unsigned
   int) [with _CharT = char, _Traits = std::char_traits<char>]
/usr/include/c++/3.2/ostream:119:                 std::basic_ostream<_CharT,
   _Traits>& std::basic_ostream<_CharT, _Traits>::operator<<(int) [with
_CharT
   = char, _Traits = std::char_traits<char>]
/usr/include/c++/3.2/ostream:130:                 std::basic_ostream<_CharT,
   _Traits>& std::basic_ostream<_CharT, _Traits>::operator<<(unsigned int)
   [with _CharT = char, _Traits = std::char_traits<char>]
/usr/include/c++/3.2/bits/ostream.tcc:234:
   std::basic_ostream<_CharT, _Traits>& std::basic_ostream<_CharT,
   _Traits>::operator<<(long long int) [with _CharT = char, _Traits =
   std::char_traits<char>]
/usr/include/c++/3.2/bits/ostream.tcc:272:
   std::basic_ostream<_CharT, _Traits>& std::basic_ostream<_CharT,
   _Traits>::operator<<(long long unsigned int) [with _CharT = char, _Traits
=
   std::char_traits<char>]
/usr/include/c++/3.2/bits/ostream.tcc:298:
   std::basic_ostream<_CharT, _Traits>& std::basic_ostream<_CharT,
   _Traits>::operator<<(double) [with _CharT = char, _Traits =
   std::char_traits<char>]
/usr/include/c++/3.2/ostream:145:                 std::basic_ostream<_CharT,
   _Traits>& std::basic_ostream<_CharT, _Traits>::operator<<(float) [with
   _CharT = char, _Traits = std::char_traits<char>]
/usr/include/c++/3.2/bits/ostream.tcc:323:
   std::basic_ostream<_CharT, _Traits>& std::basic_ostream<_CharT,
   _Traits>::operator<<(long double) [with _CharT = char, _Traits =
   std::char_traits<char>]
/usr/include/c++/3.2/bits/ostream.tcc:348:
   std::basic_ostream<_CharT, _Traits>& std::basic_ostream<_CharT,
   _Traits>::operator<<(const void*) [with _CharT = char, _Traits =
   std::char_traits<char>]
/usr/include/c++/3.2/bits/ostream.tcc:120:
   std::basic_ostream<_CharT, _Traits>& std::basic_ostream<_CharT,
   _Traits>::operator<<(std::basic_streambuf<_CharT, _Traits>*) [with _CharT
=
   char, _Traits = std::char_traits<char>]
/usr/include/c++/3.2/ostream:211:                 std::basic_ostream<_CharT,
   _Traits>& std::operator<<(std::basic_ostream<_CharT, _Traits>&, char)
[with
   _CharT = char, _Traits = std::char_traits<char>]
/usr/include/c++/3.2/bits/ostream.tcc:500:
   std::basic_ostream<char, _Traits>&
std::operator<<(std::basic_ostream<char,
   _Traits>&, char) [with _Traits = std::char_traits<char>]
/usr/include/c++/3.2/ostream:222:                 std::basic_ostream<char,
   _Traits>& std::operator<<(std::basic_ostream<char, _Traits>&, signed
char)
   [with _Traits = std::char_traits<char>]
/usr/include/c++/3.2/ostream:227:                 std::basic_ostream<char,
   _Traits>& std::operator<<(std::basic_ostream<char, _Traits>&, unsigned
char)
   [with _Traits = std::char_traits<char>]
/usr/include/c++/3.2/bits/ostream.tcc:572:
   std::basic_ostream<_CharT, _Traits>&
   std::operator<<(std::basic_ostream<_CharT, _Traits>&, const char*) [with
   _CharT = char, _Traits = std::char_traits<char>]
/usr/include/c++/3.2/bits/ostream.tcc:622:
   std::basic_ostream<char, _Traits>&
std::operator<<(std::basic_ostream<char,
   _Traits>&, const char*) [with _Traits = std::char_traits<char>]
/usr/include/c++/3.2/ostream:246:                 std::basic_ostream<char,
   _Traits>& std::operator<<(std::basic_ostream<char, _Traits>&, const
signed
   char*) [with _Traits = std::char_traits<char>]
/usr/include/c++/3.2/ostream:251:                 std::basic_ostream<char,
   _Traits>& std::operator<<(std::basic_ostream<char, _Traits>&, const
unsigned
   char*) [with _Traits = std::char_traits<char>]
*/


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]