Как работает затенение аргументов шаблона в VS2005?

В GCC этот код не будет компилироваться, потому что T затеняется, однако в VS2005 он компилируется без предупреждений, так какие предположения делает компилятор VS?

template<typename T>
class Foo
{
    template<typename T>
    void Bar(const T& bar)
    {
      ...
    }
};

person Robert Gould    schedule 28.01.2009    source источник
comment
Какое точное сообщение об ошибке вы получаете в gcc?   -  person LeopardSkinPillBoxHat    schedule 28.01.2009
comment
что-то вроде T затеняет область класса T   -  person Robert Gould    schedule 28.01.2009


Ответы (1)


Нашел правильный ответ спустя 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 позволил ему скомпилироваться без ошибок или даже предупреждений, он не соответствует требованиям. Я не знаю, что могло заставить его позволить это без стонов. Вы можете попробовать высокие уровни предупреждения.

person Johannes Schaub - litb    schedule 28.01.2009