Al experimentar un poco con las plantillas de C++ me las arreglé para producir este código simple, para el cual el resultado es diferente, de lo que esperaba de acuerdo con mi comprensión de las reglas de C++.Búsqueda de nombre para nombres que no dependen del parámetro de plantilla en VC++ 2008 Express. ¿Es un error?
void bar(double d)
{
std::cout << "bar(double) function called" << std::endl;
}
template <typename T> void foo(T t)
{
bar(3);
}
void bar(int i)
{
std::cout << "bar(int) function called" << std::endl;
}
int main()
{
foo(3);
return 0;
}
Cuando puedo compilar el código en VC++ 2008 Express, la función se llama a bar(int)
. Ese sería el comportamiento, esperaría si bar(3);
en el cuerpo de la plantilla dependiera del parámetro de la plantilla. Pero no lo es. La regla que encontré here dice "El estándar de C++ prescribe que todos los nombres que no dependen de los parámetros de la plantilla están vinculados a sus definiciones actuales al analizar una función o clase de plantilla". ¿Estoy equivocado, esa "definición actual" de bar
al analizar la función de plantilla foo
es la definición de void bar(double d);
? Por qué no es el caso si estoy equivocado. No hay declaraciones directas de bar
en esta unidad de compilación.
No le sorprendería que usted tenga razón. Me parece que la implementación de plantillas de VC++ ignora completamente los problemas dependientes/no dependientes. – UncleBens
VC++ nunca respetó la evaluación estándar de 2 pases (la primera al leer la definición de la plantilla y la segunda en la instanciación de la plantilla). Guarda la escritura 'typename' y' template' en algunos lugares pero ... no es compatible. –
En aras de la precisión, se refiere a la sección 14.6.3 Nombres no dependientes [temp.nondep] del Estándar. (Borrador final) – Francesco