#include <cstdio>
template<template<typename...> class>
struct Foo
{
enum { n = 77 };
};
template<template<typename, typename...> class C>
struct Foo<C>
{
enum { n = 99 };
};
template<typename...> struct A { };
template<typename, typename...> struct B { };
int main(int, char**)
{
printf("%d\n", Foo<A>::n);
printf("%d\n", Foo<B>::n);
}
L'idea è che template<typename, typename...> class
è un sottoinsieme di template<typename...> class
, quindi potrebbe essere possibile specializzarsi su di esso. Ma è piuttosto esoterico, quindi forse no. Proviamolo
GCC 4.7 dice:
$ g++ -std=c++11 test157.cpp
E 'stato compilato!
L'esecuzione:
$ ./a.out
77
99
Funziona!
Clang 3.1 dice:
$ clang++ -std=c++11 test157.cpp
test157.cpp:10:8: error: class template partial specialization does not specialize any template argument; to define the primary template, remove the template argument list
struct Foo<C>
^~~~
test157.cpp:9:10: error: too many template parameters in template template parameter redeclaration
template<template<typename, typename...> class C>
^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
test157.cpp:3:10: note: previous template template parameter is here
template<template<typename...> class>
^~~~~~~~~~~~~~~~~~~~~
2 errors generated.
Chi ha ragione?
Grazie. Esempio affascinante Pensandoci, il mio esempio era solo un caso specifico di quello generale di specializzazione di un parametro modello di template variadic per qualsiasi numero più specifico di parametri (per esempio due). Se provo a fare una specializzazione di 'Foo' per' template class' ottengo lo stesso comportamento: GCC accetta, Clang rifiuta. Inserirò un bug (se non è stato fatto). Una citazione dello standard mi renderebbe felice, se non è troppo disturbo. –
glaebhoerl