下面的代码不能使用clang 3.0编译,这是因为我做错了吗?是因为它在c++11中不被允许还是因为它在clang中不被支持?
template<int OFFSET>
struct A {
enum O { offset = OFFSET };
};
template < template <int T> class Head, typename... Tail>
struct C : public Head<1>, private C<Tail> { };
int main()
{
C< A, A > c1;
return 0;
}编译器错误:
test3.cxx:99:42: error: template argument for template template parameter must be a class template or type alias template
struct C : public Head<1>, private C<Tail> { };
^
test3.cxx:103:15: error: use of class template A requires template arguments
C< A, A > c1;
^
test3.cxx:94:12: note: template is declared here
struct A {
^
2 errors generated.发布于 2012-01-07 10:22:08
三个问题:
Tail应该是模板的可变列表,而不是类型的列表。因此它应该是
template<int> class... Tail而不是
typename... Tail并且您需要使用private C<Tail...>而不是private C<Tail>显式地扩展参数包。
当Tail...为空时,您将需要实现基本情况:
// base case
template < template <int> class Head>
struct C<Head> : public Head<1> { };(这是针对Clang 3.0的编译)
现在完整的代码片段:
template<int OFFSET>
struct A {
enum O { offset = OFFSET };
};
template < template <int> class Head, template<int> class... Tail>
struct C : public Head<1>, private C<Tail...> { };
template < template <int> class Head>
struct C<Head> : public Head<1> { };
int main()
{
C< A, A > c1;
return 0;
}https://stackoverflow.com/questions/8765977
复制相似问题