Errore del compilatore C2993

'identifier': tipo non valido per il parametro di modello non di tipo 'parameter'

  • Prima di C++20, non è possibile dichiarare un modello con una struttura, una classe o un argomento di unione. I puntatori possono essere usati al posto di questi tipi come parametri del modello.
  • Poiché C++20, la struttura, la classe o le unioni possono essere usate come parametri di modello non di tipo. Un parametro di modello non di tipo non può essere un tipo riferimento rvalue o un pacchetto di parametri di tipi rvalue.

L'esempio seguente genera l'errore C2993:

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

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

Prima di MSVC 19.26, il codice seguente emesso C2993. Ora genera 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 e versioni precedenti non è possibile avere parametri di modello non di tipo a virgola mobile. Poiché C++20, sono consentiti parametri di modello non di tipo a virgola mobile. Usare un argomento funzione per passare il parametro modello non di tipo a virgola mobile ai modelli di funzione.

Prima di MSVC 19.26, il codice seguente emesso C2993. Ora genera 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) {}