Tre*_*key 6 c++ templates compiler-errors g++ shadow
请看以下示例:
#include <vector>
template <typename T, template <class T> class Container>
std::vector<T> To_Vector(Container<T> const& c){
return std::vector<T>( c.begin(), c.end() );
}
int main(){}
Run Code Online (Sandbox Code Playgroud)
使用g++-5,它编译没有错误:
g++-5 -o main main.cpp
Run Code Online (Sandbox Code Playgroud)
随着g++-6就是不能通过编译:
g++-6 -o main main.cpp
main.cpp:4:33: error: declaration of template parameter ‘T’ shadows template parameter
template <typename T, template <class T> class Container>
^~~~~
main.cpp:4:11: note: template parameter ‘T’ declared here
template <typename T, template <class T> class Container>
Run Code Online (Sandbox Code Playgroud)
编译器错了吗?我的代码错了吗?
为什么不 g++-5编译这段代码g++-6呢?
g++-5 --version
g++-5 (Ubuntu 5.4.1-2ubuntu1~14.04) 5.4.1 20160904
Copyright (C) 2015 Free Software Foundation, Inc.
This is free software; see the source for copying conditions. There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
Run Code Online (Sandbox Code Playgroud)
g++-6 --version
g++-6 (Ubuntu 6.2.0-3ubuntu11~14.04) 6.2.0 20160901
Copyright (C) 2016 Free Software Foundation, Inc.
This is free software; see the source for copying conditions. There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
Run Code Online (Sandbox Code Playgroud)
g++6 的行为是正确的,因为根据标准:
模板参数不得在其范围内(包括嵌套范围)重新声明。模板参数不得与模板名称同名。
的作用域T在其声明后立即开始,因此它扩展到以下模板模板参数,该模板参数重新声明T为模板参数,因此违反了此规则。
我想 g++5 和 g++6 之间的变化是由于修复了围绕类似问题的一些错误报告。
| 归档时间: |
|
| 查看次数: |
269 次 |
| 最近记录: |