This is the mail archive of the gcc-prs@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]

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.



>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:


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