Dela via


Kompilatorfel C2993

"identifierare" : ogiltig typ för mallparametern "parameter" som inte är av typen

Anmärkningar

  • Innan C++20 kan du inte deklarera en mall med ett struktur-, klass- eller unionsargument. Pekare kan användas i stället för dessa typer som mallparametrar.
  • Sedan C++20 kan struktur, klass eller unioner användas som mallparametrar av icke-typ. En mallparameter som inte är av typen kan inte vara en rvalue-referenstyp eller ett parameterpaket med rvalue-typer.

Examples

I följande exempel genereras C2993:

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

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

Före MSVC 19.26 genererade följande kod C2993. Nu genererar den 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 {};

Med C++17 och tidigare kan du inte ha mallparametrar av typen inte flyttal. Sedan C++20 är icke-typspecifika mallparametrar i flyttal tillåtna. Använd ett funktionsargument för att skicka en flyttalstyp-icke-typ mallparameter till funktionsmallar.

Före MSVC 19.26 genererade följande kod C2993. Den genererar nu 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) {}