为什么视为部分专业化

时间:2013-03-19 18:30:45

标签: c++ templates g++

有了下面的代码,我有点困惑为什么第二个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'不是   允许

有人可以解释,我缺少什么细节。

1 个答案:

答案 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; }