有了下面的代码,我有点困惑为什么第二个foo
被认为是部分特化,而后者不是(IMO都不应该是部分)。
template <bool IS_TRUE>
int foo();
// Doesn't work!?
template <bool IS_TRUE>
int foo<IS_TRUE>() {
return 0;
}
template <>
int foo<true>() {
return 0;
}
int main() {
return foo<true>();
}
在第二个foo
gcc抱怨:
错误:函数模板部分特化'foo'不是 允许
有人可以解释,我缺少什么细节。
答案 0 :(得分:0)
名称后面带有template-arguments的语法保留用于部分特化:
template<typename T> struct foo {};
template<typename T> struct foo<T *> {};
如果部分特化无法专门化任何参数,您将收到如下错误:
template<typename T> struct foo {};
template<typename T> struct foo<T> {};
error: partial specialization 'foo<T>' does not specialize any template arguments
函数模板不允许部分特化(改为使用重载),因此编译器检查特化是否真正专门化任何模板参数是没有意义的。这无论如何都是违法的。如果要分离函数的声明和定义,则应在声明和定义中省略模板参数:
template<bool IS_TRUE> int foo();
template<bool IS_TRUE> int foo() { return 0; }
template<> int foo<true>() { return 0; }