Compartir a través de


Sobrecarga de plantillas de función

Actualización: noviembre 2007

En Visual Studio .NET, el compilador trataba funciones cuya firma estaba asignada a una especialización explícita de una función de plantilla (aun cuando la función no iba precedida de template<>) como una especialización. Ahora, tales funciones se tratan como sobrecargas (no plantillas).

El comportamiento en tiempo de ejecución puede cambiar en casos como:

// bc_overloading_of_function_templates.cpp
#include <stdio.h>
template<class T>
void f(T)   // called in Visual Studio .NET 2003
{
    printf_s("in void f(T)\n");
}

void f(int)   // called in Visual Studio .NET
// for identical behavior for both compiler versions, use
// template<> void 
// f<int>(int)
{
    printf_s("in void f(int)\n");
}

int main()
{
    f<int>(3);
    // Visual C++ .NET calls template function specialization
    // because explicit template arguments were provided. 
    // The current compiler will also call specialization because 
    // explicit template arguments were provided.
    // But these will call different functions because the previous 
    // compiler explicitly specializes on int, and the current
    // compiler does not (creates non-template overload)
   
    f(4);     
    // Visual C++ .NET will call template function specialization
    // because no global non-template overload defined.
    // The current compiler will call the non-template overload.
}

Para el ejemplo anterior, observe que se puede lograr un comportamiento idéntico haciendo de f(int) una especialización explícita en lugar de lo que debería ser una sobrecarga. Se podrán realizar llamadas a la especialización desde las versiones de Visual C++ de Visual Studio .NET 2003 y Visual Studio .NET.

Vea también

Referencia

Cambios importantes en el compilador de Visual C++