1

代码在这里。编译器是 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
};

为什么?谢谢。

4

1 回答 1

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() {}
于 2013-07-12T05:30:56.990 回答