g ++可变参数模板。简单的示例代码无法编译,抱怨'不是模板'

时间:2012-04-21 00:14:20

标签: c++ c++11 g++ variadic-templates

我在这个陌生的领域徘徊,并且我想从Danny Kalev's tutorial on the matter尝试一个简单的例子。代码非常简单:

template<> struct Count<> { static const int value = 0;};

template<typename T, typename... Args>
    struct Count<T, Args...> //partial specialization
{ 
    static const int value = 1 + Count<Args...>::value;
};

但gcc 4.4.7甚至4.7.0抱怨(尽管-std = c ++ 0x -std = gnu ++ 0x flags):

/src/tests/VTemplates.h:12:8: error: 'Count' is not a template
/src/tests/VTemplates.h:12:18: error: explicit specialization of non-template 'Count'
/src/tests/VTemplates.h:16:8: error: 'Count' is not a template
/src/tests/VTemplates.h:16:26: error: 'Count' is not a template type

我错过了什么?

1 个答案:

答案 0 :(得分:10)

template<> struct Count<> { static const int value = 0;};

是没有模板参数的模板特化。但是你不能专门化一个不是非专业模板的模板类。换句话说,您必须首先建立模板类的非专业版本,然后才能将其专门化。例如,如果您这样做:

//non-specialized template
template<typename... Args>
struct Count;

//specialized version with no arguments
template<> struct Count<> { static const int value = 0;};

//another partial specialization
template<typename T, typename... Args>
struct Count<T, Args...> 
{ 
    static const int value = 1 + Count<Args...>::value;
};

那会有用。