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