В GCC этот код не будет компилироваться, потому что T затеняется, однако в VS2005 он компилируется без предупреждений, так какие предположения делает компилятор VS?
template<typename T>
class Foo
{
template<typename T>
void Bar(const T& bar)
{
...
}
};
Ответ 1 · рейтинг 7 · Johannes Schaub - litb
Нашел правильный ответ спустя 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 позволил ему скомпилироваться без ошибок или даже предупреждений, он не соответствует требованиям. Я не знаю, что могло заставить его позволить это без стонов. Вы можете попробовать высокие уровни предупреждения.