This question already has an answer here:
Can a parameter of a template template parameter cause shadowing?

(1个答案)


4年前关闭。




请看以下示例:
#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(){}

使用g++-5,它可以正确编译:
g++-5 -o main main.cpp

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>

编译器错误吗?我的代码错了吗?
为什么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.
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.

最佳答案

g++ 6的行为是正确的,因为根据标准:


T的范围在声明后立即开始,因此扩展到以下模板模板参数,该参数将T重新声明为模板参数,因此违反了此​​规则。

我想g++ 5和g++ 6之间的变化是由于修复了围绕类似问题的一些错误报告。

07-24 09:49
查看更多