¿Cómo funciona el sombreado de argumento de plantilla en VS2005?

votos
4

En GCC, este código no se compilará, porque T se sombreará, sin embargo, en VS2005 compila sin advertencias, entonces, ¿cuáles son las suposiciones que hace el compilador VS?

template<typename T>
class Foo
{
    template<typename T>
    void Bar(const T& bar)
    {
      ...
    }
};
Publicado el 28/01/2009 a las 05:44
fuente por usuario
En otros idiomas...                            


1 respuestas

votos
7

Encontré la respuesta correcta después de 3 meses de búsqueda :) Está en 14.6.1/4el estándar:

Un parámetro de plantilla no se volverá a declarar dentro de su alcance (incluidos los ámbitos anidados). Un parámetro de plantilla no debe tener el mismo nombre que el nombre de la plantilla.

Ejemplo:

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

Si el compilador de Microsoft lo dejó compilar sin errores o incluso advertencias, no se está cumpliendo. No sé qué podría conducirlo para permitirlo sin gemir. Podría intentar niveles de advertencia altos.

Respondida el 28/01/2009 a las 06:52
fuente por usuario

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more