Compartir a través de


Error del compilador C2993

"identifier": tipo no válido para el parámetro de plantilla "parameter" sin tipo

  • Antes de C++20, no se puede declarar una plantilla con una estructura, clase o argumento de unión. Los punteros se pueden usar en lugar de estos tipos como parámetros de plantilla.
  • Dado que C++20, la estructura, la clase o las uniones se pueden usar como parámetros de plantilla que no son de tipo. Un parámetro de plantilla que no es de tipo no puede ser un tipo de referencia rvalue ni un paquete de parámetros de tipos rvalue.

El ejemplo siguiente genera la advertencia C2993:

// compile with: /c and /std:c++17
template <int&& I>   // C2993
struct S1 {};

template <int&&... Is>   // C2993
struct S2 {};

Antes de MSVC 19.26, el código siguiente emitió C2993. Ahora emite la advertencia C7582:

// compile with: /c /std:c++17
struct MyStruct {};

template <class T, MyStruct S>   // Was C2993 prior to MSVC 19.26. Now emits C7582.
class MyClass1 {};

template <class T, MyStruct* S>   // OK
class MyClass2 {};

Con C++17 y versiones anteriores, no puede tener parámetros de plantilla de punto flotante que no sean de tipo. Desde C++20, se permiten parámetros de plantilla que no son de tipo flotante. Use un argumento de función para pasar el parámetro de plantilla de punto flotante que no es de tipo a las plantillas de función.

Antes de MSVC 19.26, el código siguiente emitió C2993. Ahora emite la advertencia C7582:

// C2993b.cpp
// compile with: /c /std:c++17
template<class T, float F>   // Was C2993 prior to MSVC 19.26. Now emits C7592
void func1(T t) {}

template<class T>   // OK
void func2(T t, float F) {}