在编写正常编译的有效C ++ 03模板代码时,我遇到了一个很小的(很容易解决的)问题,在使用C ++ 11方言时无法编译。
模板参数分辨率出现问题。让这段代码成为一个例子:
template <uint32_t number>
struct number_of_bits {
enum {
value = 1 + number_of_bits<number >> 1>::value
};
};
template <>
struct number_of_bits<0> {
enum {
value = 0
};
};
由于C ++ 11现在允许&#34;&gt;&gt;&#34;要完成将模板化参数作为最后一个参数的模板参数列表,它会在解析此代码时产生问题。
我使用GCC(版本4.8.1)作为我的编译器,它使用命令行正常编译:
g++ test.cc -o test
但是当我添加-std=c++11
命令行开关时,它无法编译:
g++ -std=c++11 test.cc -o test
这是C ++ 11语言功能还是GCC中的错误?如果是这种情况,这是一个已知的错误吗?
答案 0 :(得分:7)
Clang ++在-std=c++03
模式下给我一个警告:
test.cpp:6:43: warning: use of right-shift operator ('>>') in template argument
will require parentheses in C++11 [-Wc++11-compat]
value = 1 + number_of_bits<number >> 1>::value
^
( )
事实上,在C ++ 11中,修改了解析规则,以便>>
始终关闭模板上下文中的模板参数。如警告所述,您应该在参数周围放置一些parens来修复解析问题:
value = 1 + number_of_bits<(number >> 1)>::value