Delen via


Compilerfout C2993

'identificator': ongeldig type voor niet-type sjabloonparameter 'parameter'

Opmerkingen

  • Vóór C++20 kunt u een sjabloon met een structuur, klasse of samenvoegingsargument niet declareren. Aanwijzers kunnen worden gebruikt in plaats van deze typen als sjabloonparameters.
  • Sinds C++20 kunnen structuren, klassen of unies worden gebruikt als niet-type sjabloonparameters. Een niet-type sjabloonparameter kan geen verwijzingstype voor rvalue of een parameterpakket met rvalue-typen zijn.

Voorbeelden

In het volgende voorbeeld wordt C2993 gegenereerd:

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

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

Vóór MSVC 19.26 wordt de volgende code C2993 verzonden. Het verzendt nu 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 {};

Met C++17 en eerder kunt u geen sjabloonparameters van het type zwevendekomma hebben. Sinds C++20 zijn niet-type sjabloonparameters met drijvende-komma waarden toegestaan. Gebruik een functieargument om de sjabloonparameter van het drijvende komma niet-type door te geven aan functiesjablonen.

Vóór MSVC 19.26 wordt de volgende code C2993 verzonden. Het verzendt 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) {}