>Submitter-Id:  net
>Originator:    Andrew Sayers
>Organization:  
>Confidential:  no
>Synopsis:      G++ returns compilation errors on several (presumably) valid 
>nested template classes
>Severity:      serious
>Priority:      medium
>Category:      c++
>Class:         rejects-legal
>Release:       4.0.2 20050725 (prerelease) (Debian 4.0.1-3) (Debian 
>testing/unstable)
>Environment:
System: Linux nautilus 2.6.12.3 #1 Fri Jul 29 13:43:06 BST 2005 i686 GNU/Linux
Architecture: i686

        
host: i486-pc-linux-gnu
build: i486-pc-linux-gnu
target: i486-pc-linux-gnu
configured with: ../src/configure -v 
--enable-languages=c,c++,java,f95,objc,ada,treelang --prefix=/usr 
--enable-shared --with-system-zlib --libexecdir=/usr/lib --enable-nls 
--without-included-gettext --enable-threads=posix --program-suffix=-4.0 
--enable-__cxa_atexit --enable-libstdcxx-allocator=mt --enable-clocale=gnu 
--enable-libstdcxx-debug --enable-java-gc=boehm --enable-java-awt=gtk 
--enable-gtk-cairo --with-java-home=/usr/lib/jvm/java-1.4.2-gcj-4.0-1.4.2.0/jre 
--enable-mpfr --disable-werror --enable-checking=release i486-linux-gnu
>Description:

I'm not sure whether this is a single bug or a family of related ones, so I'm 
filing it as a single report for now.  I've not been able to find any precedent 
for this kind of code, but I expect at least one of the two error templates 
must be legal.

This bug is triggered when a template class is declared inside another template 
class, then defined outside it.  The following causes compilation errors for 
the first two nested templates, the final template provides a partial 
workaround:

template<int a>
class containing_template {
public:
        template<int b> class error1;

        template<int b> class error2;
private:
        template<int a1, int b> class workaround_backend;
public:
        template<int b> class workaround : public workaround_backend<a, b> {};
};

template<> template<int a, int b> class containing_template<a>::error1<b> {};
template<> template<int a> template<int b> class 
containing_template<a>::error2<b> {};
template<> template<int a, int b> class 
containing_template<a>::workaround_backend<a, b> {};

int main() { return 0; };

The containing template causes no problems.  The "error1" template causes the 
compiler to complain that:
        test.cpp:13: error: template parameters not used in partial 
specialization:
        test.cpp:13: error:         'a'
The second template causes the compiler to complain that:
        test.cpp:14: error: partial specialization 
'containing_template<a>::error2<b>' does not specialize any template arguments

By my understanding of C++, these aren't partial specialisations, they're 
definitions.  I'm not sure why the compiler thinks otherwise.  For templates 
that actually are partial specialisitions, I've even seen the compiler complain 
that the specialisation doesn't exist when I try to instantiate it.  If the 
above code is valid but the general class of error isn't obvious from it, I can 
file a bug report on this other case.

>How-To-Repeat:
This error is triggered whenever I try to compile this code.
>Fix:
In this trivial case, the inner templates could be defined inside the 
containing template, however this is not always desirable or even possible for 
complex templates.

The workaround in the code will avoid the problem for fairly simple cases, but 
more complex cases seem to trigger bugs like these even with the workaround.  
Again, I can try to verify this and report it if you like.

        - Andrew


-- 
To UNSUBSCRIBE, email to [EMAIL PROTECTED]
with a subject of "unsubscribe". Trouble? Contact [EMAIL PROTECTED]

Reply via email to