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) {}