在GCC中,此代码将无法编译,因为T被遮盖了,但在VS2005中,它可以编译而不会出现警告,那么VS编译器正在做什么样的假设?
template<typename T>
class Foo
{
template<typename T>
void Bar(const T& bar)
{
...
}
};
在GCC中,此代码将无法编译,因为T被遮盖了,但在VS2005中,它可以编译而不会出现警告,那么VS编译器正在做什么样的假设?
template<typename T>
class Foo
{
template<typename T>
void Bar(const T& bar)
{
...
}
};
在寻找3个月后找到了正确答案 :) 它在标准的14.6.1/4
中:
一个模板参数不得在其范围内(包括嵌套范围内)重新声明。模板参数不得与模板名称同名。
例子:
template<class T, int i> class Y { int T; // error: template-parameter redeclared void f() { char T; // error: template-parameter redeclared } }; template<class X> class X; // error: template-parameter redeclared
如果Microsoft编译器不出现错误或警告即可编译通过,则不符合规范。我不知道是什么原因让它能够默默批准。您可以尝试提高警告级别。