Поделиться через


Перегрузка шаблонов функций

Обновлен: Ноябрь 2007

В Visual Studio .NET компилятор воспринимал функции, чья подпись сопоставлена с явной специализацией функции шаблона (даже если эта функция не имела префикса template<>), как специализацию. Теперь такие функции воспринимаются как перегрузки не из шаблона.

Поведение во время выполнения может измениться в следующих случаях:

// 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.
}

Обратите внимание, что в случае предыдущего примера аналогичное поведение можно получить, сделав f(int) явной специализацией, а не перегрузкой. Эта специализация будет вызываться в Visual C++ версий Visual Studio .NET 2003 и Visual Studio .NET.

См. также

Ссылки

Критические изменения в компиляторе Visual C++