繁体   English   中英

有效的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中,修改了解析规则,以便>>始终在模板上下文中关闭模板参数。 正如警告所述,您应该在参数周围放置一些parens来修复解析问题:

value = 1 + number_of_bits<(number >> 1)>::value

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM