Compilerfehler C2993

'Identifier' : ungültiger Typ für den Parameter 'parameter' des Typs 'nicht typ'

  • Vor C++20 können Sie keine Vorlage mit einem Struktur-, Klassen- oder Union-Argument deklarieren. Zeiger können anstelle dieser Typen als Vorlagenparameter verwendet werden.
  • Da C++20, Struktur, Klasse oder Vereinigungen als Vorlagenparameter ohne Typ verwendet werden können . Ein Nicht-Typ-Vorlagenparameter kann kein Rvalue-Verweistyp oder ein Parameterpaket von Rvalue-Typen sein.

Im folgenden Beispiel wird C2993 generiert:

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

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

Vor MSVC 19.26 wurde der folgende Code C2993 ausgegeben. Es emittiert jetzt 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 {};

Bei C++17 und früheren Versionen können Sie keine Gleitkommavorlagenparameter ohne Typ aufweisen. Seit C++20 sind gleitkommafreie Vorlagenparameter zulässig. Verwenden Sie ein Funktionsargument, um den Gleitkommaparameter ohne Typvorlage an Funktionsvorlagen zu übergeben.

Vor MSVC 19.26 wurde der folgende Code C2993 ausgegeben. Es emittiert jetzt 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) {}