gcc accepts following code.
Basically, this code specify template arguments to ordinary template parameter
pack(i.e. non template template parameter pack).

// given this primary template
template < typename ... Types >
class Foo { } ;

// gcc accepts this parcial specialization
// If I use template keyword.
template < typename ... Types, typename ... Params >
class Foo< template Types < Params... > ... >
{ } ;

// gcc also accepts this. the difference is position of template keyword.
template < typename ... Types, typename ... Params >
class Foo< Types template < Params... > ... >
{ } ;


This must be ill-formed.
The template keyword for the typename-specifier is for nested-name-specifier.
Types is not.
Types is not a template template parameter pack, yet it takes template
arguments if I use broken typename-specifier-like syntax.


When I found this, I wanted to write class template Foo which can be
instantiated like this:

Foo<
    std::tuple<int, char, short>,
    std::tuple<float>,
    std::tuple<double, double>
> foo ;

It accepts any number of std::tuple types(or whatever class templates) with
each std::tuple take any number of template arguments in any type.
The obvious implementation of this is using template template parameter pack in
partial specialization.

template < typename ... Types >
class Foo { };

template <
    template < typename ... > class ... Types,
    typename ... Params
>
class Foo< Types< Params... > ... >
{ } ;

But I happened to write above ordinary template parameter pack version.
And found this bug.


-- 
           Summary: gcc accepts ill-formed template code combining Variadic
                    Templates and Partial specialization
           Product: gcc
           Version: 4.6.0
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: c++
        AssignedTo: unassigned at gcc dot gnu dot org
        ReportedBy: boostcpp at gmail dot com


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

Reply via email to