奇怪!静态const unsigned不是类模板中的常量表达式?

时间:2013-07-12 05:06:26

标签: c++ templates template-specialization

代码就在这里。编译器是VC ++ 2012。

template<class T> // Normal class is okay. But template has the problem.
class A
{
    const static unsigned N = 2; // not okay

    // enum {N = 2}; // this is okay

    template<unsigned i> void Fun() {}

    template<> void Fun<N>() {} // error C2975 not constant expression
};

为什么呢?感谢。

1 个答案:

答案 0 :(得分:2)

编译器可能提供了错误的错误消息,但代码格式错误,因为template<>范围内的class {}无效。这声明了一个显式的特化,它只能出现在命名空间范围内。

不幸的是,除了明确的类模板特化(不再是类模板)之外,你不能专门化一个类模板成员函数模板。

尝试使用重载和SFINAE。功能模板专业化通常是一个坏主意。

template<unsigned i> typename std::enable_if< i != N >::type Fun() {}
template<unsigned i> typename std::enable_if< i == N >::type Fun() {}