This is the mail archive of the
gcc-bugs@gcc.gnu.org
mailing list for the GCC project.
typedef of pair<> != pair<> in copy(); have to define pair<> derived class
- From: "Michael H. Cox" <mhcox at bluezoosoftware dot com>
- To: "GCC Help" <gcc-help at gcc dot gnu dot org>,"GCC Bugs" <gcc-bugs at gcc dot gnu dot org>
- Date: Tue, 18 Feb 2003 00:39:10 -0700
- Subject: typedef of pair<> != pair<> in copy(); have to define pair<> derived class
- Reply-to: <mhcox at bluezoosoftware dot com>
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>]
*/