Hi, 

I tried to compile quite simple code: a template and operator<<(ostreami&) for 
it
(as a template function). The template is in a namespace, but operator<< I'd
like to have in the 'std' namespace. 

Unfortunately, the compiler rejected the code, however other compilers 
(i.e. in other versions) compiled the code without any complainits. 

I'm quite sure that the code is correct, buti, to be honest, I didn't check 
what c++ iso standard is saying about it.

I tested the following code on my on version 3.4.3-20050101 and then build and 
tested on the 3.4.4-20050506 snapshot. The issue occured in both versions.

On the other hand, I compiled successfully the same code on g++ 3.3.5-20050130 
that is installed on other (old&slow) box (gentoo, i586, for details see 
below). 

Additionally, I tested the same code on 2.95.x on Solaris (SunOS 5.9? - but I 
don't
remember right now) - it was also compiled.

I didn't check gcc-4.x.

Summary: 

The code (problem.cc):

#include<iostream>
using namespace std;

namespace a {
    template<typename T> class A;
}

template<typename T>
std::ostream & std::operator<< (std::ostream &, a::A<T> const &);

namespace a
{
    template<typename T> class A
    {
        T v;
    public:
        A(T _v) : v(_v) {};
        friend std::ostream & std::operator<< <>(std::ostream &, A<T> const &);
    };
}


template<typename T>
std::ostream & std::operator<<(std::ostream & o, a::A<T> const & aa)
{
    return o << aa.v ;
}

int main()
{
    a::A<float> o(16.0);

    cerr << o << endl;
}


Command: g++ problem.cc 

Output: 

problem.cc: In instantiation of `a::A<float>':
problem.cc:32:   instantiated from here
problem.cc:19: error: template-id `operator<< <>' for `std::basic_ostream<char,
std::char_traits<char> >& std::operator<<(std::basic_ostream<char,
std::char_traits<char> >&, const a::A<float>&)' does not match any template
declaration
problem.cc: In function `std::ostream& std::operator<<(std::ostream&, const
a::A<T>&) [with T = float]':
problem.cc:34:   instantiated from here
problem.cc:16: error: `float a::A<float>::v' is private
problem.cc:27: error: within this context


Compilation failed on 3.4.3-20050101 and 3.4.4-20050506 on my box:

Release:       3.4.4 20050506 (prerelease)
Environment:
System: Linux baki 2.6.12-rc1baki #5 Sat Mar 26 09:01:44 UTC 2005 i686 AMD
Athlon(tm) XP 2000+ AuthenticAMD GNU/Linux
Architecture: i686
host: i686-pc-linux-gnu
build: i686-pc-linux-gnu
target: i686-pc-linux-gnu
configured with:  :
(reconfigured) ./configure --prefix=/home/marciso/gcc-tmp-installatio
--enable-languages=c++
                                                 
          
Release:3.4.3-20050110 (Gentoo Linux 3.4.3.20050110-r2, ssp-3.4.3.20050110-0,
pie-8.7.7)
Environment:
System: Linux baki 2.6.12-rc1baki #5 Sat Mar 26 09:01:44 UTC 2005 i686 AMD
Athlon(tm) XP 2000+ AuthenticAMD GNU/Linux
Architecture: i686

host: i686-pc-linux-gnu
build: i686-pc-linux-gnu
target: i686-pc-linux-gnu
configured with: /var/tmp/portage/gcc-3.4.3.20050110-r2/work/gcc-3.4.3/configure
--enable-version-specific-runtime-libs --prefix=/usr
--bindir=/usr/i686-pc-linux-gnu/gcc-bin/3.4.3-20050110
--includedir=/usr/lib/gcc/i686-pc-linux-gnu/3.4.3-20050110/include
--datadir=/usr/share/gcc-data/i686-pc-linux-gnu/3.4.3-20050110
--mandir=/usr/share/gcc-data/i686-pc-linux-gnu/3.4.3-20050110/man
--infodir=/usr/share/gcc-data/i686-pc-linux-gnu/3.4.3-20050110/info
--with-gxx-include-dir=/usr/lib/gcc/i686-pc-linux-gnu/3.4.3-20050110/include/g++-v3
--host=i686-pc-linux-gnu --disable-altivec --enable-nls
--without-included-gettext --with-system-zlib --disable-checking
--disable-werror --disable-libunwind-exceptions --disable-multilib
--enable-java-awt=gtk --enable-languages=c,c++,objc,java,f77 --enable-shared
--enable-threads=posix --enable-__cxa_atexit --enable-clocale=gnu



Compilation passed on 3.3.5-20050130:

Release:       3.3.5-20050130 (Gentoo Linux 3.3.5.20050130-r1,
ssp-3.3.5.20050130-1, pie-8.7.7.1)
Environment:
System: Linux gateway 2.6.10-hardened-r3bramka #2 Sun Feb 20 12:58:22 CET 2005
i586 GNU/Linux
Architecture: i586

host: i586-pc-linux-gnu
build: i586-pc-linux-gnu
target: i586-pc-linux-gnu
configured with:
/var/tmp/portage/gcc-3.3.5.20050130-r1/work/gcc-3.3.5/configure
--enable-version-specific-runtime-libs --prefix=/usr
--bindir=/usr/i586-pc-linux-gnu/gcc-bin/3.3.5-20050130
--includedir=/usr/lib/gcc-lib/i586-pc-linux-gnu/3.3.5-20050130/include
--datadir=/usr/share/gcc-data/i586-pc-linux-gnu/3.3.5-20050130
--mandir=/usr/share/gcc-data/i586-pc-linux-gnu/3.3.5-20050130/man
--infodir=/usr/share/gcc-data/i586-pc-linux-gnu/3.3.5-20050130/info
--with-gxx-include-dir=/usr/lib/gcc-lib/i586-pc-linux-gnu/3.3.5-20050130/include/g++-v3
--host=i586-pc-linux-gnu --disable-altivec --enable-nls
--without-included-gettext --with-system-zlib --disable-checking
--disable-werror --disable-libunwind-exceptions --disable-multilib
--disable-libgcj --enable-languages=c,c++,f77 --enable-shared
--enable-threads=posix --enable-__cxa_atexit --enable-clocale=gnu



Cheers
Marcin.

-- 
           Summary: problem with tempalte and tempalte function compilation
                    in a namespace
           Product: gcc
           Version: 3.3.4
            Status: UNCONFIRMED
          Severity: normal
          Priority: P2
         Component: c++
        AssignedTo: unassigned at gcc dot gnu dot org
        ReportedBy: marciso at box43 dot pl
                CC: gcc-bugs at gcc dot gnu dot org
 GCC build triplet: i686-pc-linux-gnu
  GCC host triplet: i686-pc-linux-gnu
GCC target triplet: i686-pc-linux-gnu


http://gcc.gnu.org/bugzilla/show_bug.cgi?id=21515

Reply via email to