我在编写有效的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现在允许">>“完成以模板化参数作为最后一个参数的模板参数列表,所以在解析此代码时会产生问题。
我使用GCC (4.8.1版)作为编译器,它通常使用命令行进行编译:
g++ test.cc -o test但是,当我添加-std=c++11命令行开关时,它无法编译:
g++ -std=c++11 test.cc -o test这是C++11语言的特性,还是GCC的一个bug?如果是这样的话,这是已知的窃听器吗?
发布于 2015-07-16 06:47:34
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)>::valuehttps://stackoverflow.com/questions/31447039
复制相似问题