0

拥有以下代码,我有点困惑为什么第二个foo被视为部分专业化,而后者不是(IMO 两者都不应该是partial)。

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>();
}

在第二个foogcc 抱怨:

错误:不允许函数模板部分特化“foo”

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

4

1 回答 1

0

名称后带有模板参数的语法保留用于部分特化:

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; }
于 2013-03-20T08:24:59.600 回答