From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 25520 invoked by alias); 12 Dec 2001 21:46:09 -0000 Mailing-List: contact gcc-prs-help@gcc.gnu.org; run by ezmlm Precedence: bulk List-Archive: List-Post: List-Help: Sender: gcc-prs-owner@gcc.gnu.org Received: (qmail 25478 invoked by uid 71); 12 Dec 2001 21:46:06 -0000 Resent-Date: 12 Dec 2001 21:46:06 -0000 Resent-Message-ID: <20011212214606.25477.qmail@sources.redhat.com> Resent-From: gcc-gnats@gcc.gnu.org (GNATS Filer) Resent-To: nobody@gcc.gnu.org Resent-Cc: gcc-prs@gcc.gnu.org, gcc-bugs@gcc.gnu.org Resent-Reply-To: gcc-gnats@gcc.gnu.org, ilya@vailsys.com Received:(qmail 23801 invoked by uid 61); 12 Dec 2001 21:43:39 -0000 Message-Id:<20011212214339.23799.qmail@sources.redhat.com> Date: Wed, 12 Dec 2001 13:46:00 -0000 From: ilya@vailsys.com Reply-To: ilya@vailsys.com To: gcc-gnats@gcc.gnu.org X-Send-Pr-Version:gnatsweb-2.9.2 (1.1.1.1.2.21) 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. X-SW-Source: 2001-12/txt/msg00759.txt.bz2 List-Id: >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 &) >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: