This is the mail archive of the
gcc-prs@gcc.gnu.org
mailing list for the GCC project.
c++/5098: Compile error for operator<<(ostream&, const std::string&) when a template definition defined within namespace and has an operator<< defined as a friend.
- From: ilya at vailsys dot com
- To: gcc-gnats at gcc dot gnu dot org
- Date: 12 Dec 2001 21:43:39 -0000
- Subject: c++/5098: Compile error for operator<<(ostream&, const std::string&) when a template definition defined within namespace and has an operator<< defined as a friend.
- Reply-to: ilya at vailsys dot com
>Number: 5098
>Category: c++
>Synopsis: Compile error for operator<<(ostream&, const std::string&) when a template definition defined within namespace and has an operator<< defined as a friend.
>Confidential: no
>Severity: serious
>Priority: high
>Responsible: unassigned
>State: open
>Class: sw-bug
>Submitter-Id: net
>Arrival-Date: Wed Dec 12 13:46:03 PST 2001
>Closed-Date:
>Last-Modified:
>Originator: ilya@vailsys.com
>Release: 2.95.3
>Organization:
>Environment:
SunOS vss06 5.8 Generic_108529-11 i86pc i386 i86pc
>Description:
A simple piece of code produces a compilation error
'no match for `_IO_ostream_withassign & << string &', in presence of namespace for a template that has its own 'operator<<' defined.
If there is no namespace (compile without -DNAMESPACE) everything compiles as expected.
--------------------------------------------------------
uname -a
SunOS vss06 5.8 Generic_108529-11 i86pc i386 i86pc
----------------------------------------------------
----------------------------------------------------
compile options
g++ -DNAMESPACE -o namespace2 namespace2.cpp
----------------------------------------------------
----------------------------------------------------
g++ -v -save-temps -DNAMESPACE -o namespace2 namespace2.cpp
Reading specs from /opt/sfw/lib/gcc-lib/i386-pc-solaris2.8/2.95.3/specs
gcc version 2.95.3 20010315 (release)
/opt/sfw/lib/gcc-lib/i386-pc-solaris2.8/2.95.3/cpp0 -lang-c++ -v -D__GNUC__=2 -D__GNUG__=2 -D__GNUC_MINOR__=95 -D__cplusplus -Dunix -D__svr4__ -D__SVR4 -Dsun -D__unix__ -D__svr4__ -D__SVR4 -D__sun__ -D__unix -D__sun -Asystem(svr4) -D__EXCEPTIONS -Acpu(i386) -Amachine(i386) -Di386 -D__i386 -D__i386__ -DNAMESPACE namespace2.cpp namespace2.ii
GNU CPP version 2.95.3 20010315 (release) (i386 System V Release 4)
#include "..." search starts here:
#include <...> search starts here:
/opt/sfw/lib/gcc-lib/i386-pc-solaris2.8/2.95.3/../../../../include/g++-3
/opt/sfw/include
/opt/sfw/lib/gcc-lib/i386-pc-solaris2.8/2.95.3/../../../../i386-pc-solaris2.8/include
/opt/sfw/lib/gcc-lib/i386-pc-solaris2.8/2.95.3/include
/usr/include
End of search list.
The following default directories have been omitted from the search path:
End of omitted list.
/opt/sfw/lib/gcc-lib/i386-pc-solaris2.8/2.95.3/cc1plus namespace2.ii -quiet -dumpbase namespace2.cc -version -o namespace2.s
GNU C++ version 2.95.3 20010315 (release) (i386-pc-solaris2.8) compiled by GNU C version 2.95.3 20010315 (release).
namespace2.cpp: In function `int main()':
namespace2.cpp:39: no match for `_IO_ostream_withassign & << string &'
/opt/sfw/lib/gcc-lib/i386-pc-solaris2.8/2.95.3/../../../../include/g++-3/iostream.h:77: candidates are: class ostream & ostream::operator <<(char)
/opt/sfw/lib/gcc-lib/i386-pc-solaris2.8/2.95.3/../../../../include/g++-3/iostream.h:78: class ostream & ostream::operator <<(unsigned char)
/opt/sfw/lib/gcc-lib/i386-pc-solaris2.8/2.95.3/../../../../include/g++-3/iostream.h:79: class ostream & ostream::operator <<(signed char)
/opt/sfw/lib/gcc-lib/i386-pc-solaris2.8/2.95.3/../../../../include/g++-3/iostream.h:80: class ostream & ostream::operator <<(const char *)
/opt/sfw/lib/gcc-lib/i386-pc-solaris2.8/2.95.3/../../../../include/g++-3/iostream.h:82: class ostream & ostream::operator <<(const unsigned char *)
/opt/sfw/lib/gcc-lib/i386-pc-solaris2.8/2.95.3/../../../../include/g++-3/iostream.h:84: class ostream & ostream::operator <<(const signed char *)
/opt/sfw/lib/gcc-lib/i386-pc-solaris2.8/2.95.3/../../../../include/g++-3/iostream.h:85: class ostream & ostream::operator <<(const void *)
/opt/sfw/lib/gcc-lib/i386-pc-solaris2.8/2.95.3/../../../../include/g++-3/iostream.h:86: class ostream & ostream::operator <<(int)
/opt/sfw/lib/gcc-lib/i386-pc-solaris2.8/2.95.3/../../../../include/g++-3/iostream.h:87: class ostream & ostream::operator <<(unsigned int)
/opt/sfw/lib/gcc-lib/i386-pc-solaris2.8/2.95.3/../../../../include/g++-3/iostream.h:88: class ostream & ostream::operator <<(long int)
/opt/sfw/lib/gcc-lib/i386-pc-solaris2.8/2.95.3/../../../../include/g++-3/iostream.h:89: class ostream & ostream::operator <<(long unsigned int)
/opt/sfw/lib/gcc-lib/i386-pc-solaris2.8/2.95.3/../../../../include/g++-3/iostream.h:91: class ostream & ostream::operator <<(long long int)
/opt/sfw/lib/gcc-lib/i386-pc-solaris2.8/2.95.3/../../../../include/g++-3/iostream.h:92: class ostream & ostream::operator <<(long long unsigned int)
/opt/sfw/lib/gcc-lib/i386-pc-solaris2.8/2.95.3/../../../../include/g++-3/iostream.h:94: class ostream & ostream::operator <<(short int)
/opt/sfw/lib/gcc-lib/i386-pc-solaris2.8/2.95.3/../../../../include/g++-3/iostream.h:95: class ostream & ostream::operator <<(short unsigned int)
/opt/sfw/lib/gcc-lib/i386-pc-solaris2.8/2.95.3/../../../../include/g++-3/iostream.h:97: class ostream & ostream::operator <<(bool)
/opt/sfw/lib/gcc-lib/i386-pc-solaris2.8/2.95.3/../../../../include/g++-3/iostream.h:99: class ostream & ostream::operator <<(double)
/opt/sfw/lib/gcc-lib/i386-pc-solaris2.8/2.95.3/../../../../include/g++-3/iostream.h:100: class ostream & ostream::operator <<(float)
/opt/sfw/lib/gcc-lib/i386-pc-solaris2.8/2.95.3/../../../../include/g++-3/iostream.h:104: class ostream & ostream::operator <<(long double)
/opt/sfw/lib/gcc-lib/i386-pc-solaris2.8/2.95.3/../../../../include/g++-3/iostream.h:106: class ostream & ostream::operator <<(ostream & (*)(ostream &))
/opt/sfw/lib/gcc-lib/i386-pc-solaris2.8/2.95.3/../../../../include/g++-3/iostream.h:107: class ostream & ostream::operator <<(ios & (*)(ios &))
/opt/sfw/lib/gcc-lib/i386-pc-solaris2.8/2.95.3/../../../../include/g++-3/iostream.h:108: class ostream & ostream::operator <<(streambuf *)
namespace2.cpp:10: class ostream & xyz::operator <<(ostream &, const xyz::ResourcePool<int> &)
>How-To-Repeat:
Try to compile the attached file with -DNAMESPACE and without it. The only difference is that in the latter a template class defined in a global scope.
>Fix:
>Release-Note:
>Audit-Trail:
>Unformatted: