有效的C ++ 03模板代码无法在C ++ 11

时间:2015-07-16 06:44:29

标签: c++ c++11 template-meta-programming

在编写正常编译的有效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中的错误?如果是这种情况,这是一个已知的错误吗?

1 个答案:

答案 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
相关问题