2013-07-12 77 views
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 
}; 

为什么?谢谢。

+0

摆脱N'的'和'使用乐趣<2>'你应该得到同样的错误,至少在GCC 4.8.1(我假设VS就会有他们,但你没有发布错误) 。这真的对你的问题的标题有影响。 – chris

+0

@chris我纠正了我的问题。谢谢。 – user1899020

回答

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() {} 
+0

对不起,我没有明白。当你说无效时,它是不是可编译的?你的乐趣()假设要做什么?当调用乐趣()时,出现编译错误?谢谢。 – user1899020

+0

@ user1899020只要在class {}内看到'template <>',编译器就应该放弃。是的,无效的手段不会编译。如果编译器从未编译过“Fun”声明,那么如果它进入'Fun '这也会导致另一个错误。如果您使用了我的建议声明,并且它们在您的程序中有效,那么可以按照您的意愿将“Fun <2>”和“Fun <1>”分派给不同的功能。 – Potatoswatter