Partager via


Erreur du compilateur C2993

'identifier' : type illégal pour le paramètre de modèle non de type 'parameter'

  • Avant C++20, vous ne pouvez pas déclarer un modèle avec une structure, une classe ou un argument union. Les pointeurs peuvent être utilisés à la place de ces types en tant que paramètres de modèle.
  • Dans la mesure où C++20, la structure, la classe ou les unions peuvent être utilisées comme paramètres de modèle non de type. Un paramètre de modèle non de type ne peut pas être un type de référence rvalue ou un pack de paramètres de types rvalue.

L’exemple suivant génère l’erreur C2993 :

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

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

Avant MSVC 19.26, le code suivant a émis C2993. Il émet maintenant 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 {};

Avec C++17 et versions antérieures, vous ne pouvez pas avoir de paramètres de modèle sans type à virgule flottante. Étant donné que C++20, les paramètres de modèle sans type à virgule flottante sont autorisés. Utilisez un argument de fonction pour passer le paramètre de modèle sans type à virgule flottante aux modèles de fonction.

Avant MSVC 19.26, le code suivant a émis C2993. Il émet maintenant 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) {}