Compartir a través de


Advertencia del compilador C5037

"member-function": una definición fuera de línea de un miembro de una plantilla de clase no puede tener argumentos predeterminados

Comentarios

No se permiten argumentos predeterminados en definiciones fuera de línea de funciones miembro en clases de plantilla. El compilador emite una advertencia de nivel 3 en /permissive y un error en /permissive-.

Esta advertencia se introdujo en la versión 15.3 de Visual Studio 2017. El código que se compilaba sin advertencias en versiones del compilador anteriores a la versión 15.3 de Visual Studio 2017 ahora puede generar la advertencia C5037. Si desea información sobre cómo deshabilitar las advertencias introducidas en una versión determinada del compilador o una versión posterior, consulte Advertencias del compilador por versión del compilador. Puede deshabilitarla con la opción del compilador /wd:5037 o mediante #pragma warning(disable:5037).

Ejemplo

En versiones anteriores de Visual Studio, el siguiente código con formato incorrecto podría generar un bloqueo en tiempo de ejecución. En la versión 15.3 de Visual Studio 2017 se produce la advertencia C5037:

// C5037.cpp
// compile using: cl /c /permissive- C5037.cpp
template <typename T>
struct A {
    T f(T t, bool b = false);
};

template <typename T>
T A<T>::f(T t, bool b = false) // C5037: 'A<T>::f': an out-of-line definition of a member of a class template cannot have default arguments
{
    // ...
}

Para corregir el error, quite el argumento predeterminado = false.