我试图用metaprograming技术来创建一个编译时位掩码递归模板,我的想法是创建这样的:了编译时位掩码
unsigned int Mask3 = Mask<2>(); // value = 0x03 = b00000000000000000000000000000011
unsigned int Mask3 = Mask<3>(); // value = 0x07 = b00000000000000000000000000000111
unsigned int Mask3 = Mask<7>(); // value = 0x7F = b00000000000000000000000001111111
我想要的代码是这样的:
template <const unsigned int N> const unsigned int Mask()
{
if (N <= 1)
{
return 1;
}
else
{
return ((1 << N) | Mask<N - 1>());
}
}
return 1;
但它导致吨双警告:
- 警告C4554: '< <':检查运算符优先级为可能出现的错误
- 警告C4293: '< <':移位计数负或过大
而在最后,编译错误:
- 错误C1202:递归类型或函数依赖关系上下文过于复杂。
所以,我推断递归永远不会结束并落入编译器无限循环,但我不理解为什么。
为什么你不会像“int result = 0; for(i = 0; i
SinisterMJ
2012-08-02 13:50:26