Как работает затенение аргументов шаблона в VS2005? - PullRequest
4 голосов
/ 28 января 2009

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

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

1 Ответ

7 голосов
/ 28 января 2009

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...