有效的 C++03 模板代码无法在 C++11 中编译
Valid C++03 template code won't compile in C++11
我在编写有效的 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 中的错误?如果是这样的话,这是一个已知错误吗?
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 中修改了解析规则,因此 >>
总是在模板上下文中关闭模板参数。正如警告所指出的那样,您应该只在参数周围放置括号以解决解析问题:
value = 1 + number_of_bits<(number >> 1)>::value
我在编写有效的 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 中的错误?如果是这样的话,这是一个已知错误吗?
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 中修改了解析规则,因此 >>
总是在模板上下文中关闭模板参数。正如警告所指出的那样,您应该只在参数周围放置括号以解决解析问题:
value = 1 + number_of_bits<(number >> 1)>::value