首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >有效的C++03模板代码不会在C++11中编译

有效的C++03模板代码不会在C++11中编译
EN

Stack Overflow用户
提问于 2015-07-16 06:44:29
回答 1查看 576关注 0票数 4

我在编写有效的C++03模板代码时遇到了一个小问题(虽然很容易解决),它通常编译,在使用C++11方言时不会编译。

这个问题出现在模板参数解析上。让这段代码成为一个例子:

代码语言:javascript
运行
复制
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版)作为编译器,它通常使用命令行进行编译:

代码语言:javascript
运行
复制
g++ test.cc -o test

但是,当我添加-std=c++11命令行开关时,它无法编译:

代码语言:javascript
运行
复制
g++ -std=c++11 test.cc -o test

这是C++11语言的特性,还是GCC的一个bug?如果是这样的话,这是已知的窃听器吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-07-16 06:47:34

Clang++在-std=c++03模式下给我一个警告:

代码语言:javascript
运行
复制
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来修复解析问题:

代码语言:javascript
运行
复制
value = 1 + number_of_bits<(number >> 1)>::value
票数 7
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/31447039

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档