【发布时间】:2012-04-04 01:29:14
【问题描述】:
我有代码:
#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);
}
这个想法是template<typename, typename...> class 是template<typename...> class 的一个子集,因此可能可以专门研究它。但它非常深奥,所以也许不是。让我们试试看。
GCC 4.7 说:
$ g++ -std=c++11 test157.cpp
编译好了!
运行它:
$ ./a.out
77
99
有效!
Clang 3.1 说:
$ 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.
谁是对的?
【问题讨论】:
标签: c++ templates c++11 template-specialization variadic-templates