Błąd kompilatora C2993

"identifier" : niedozwolony typ parametru szablonu innego niż typ "parametr"

  • Przed językiem C++20 nie można zadeklarować szablonu ze strukturą, klasą lub argumentem unii. Wskaźniki mogą być używane zamiast tych typów jako parametry szablonu.
  • Ponieważ C++20, struktury, klasy lub unii mogą być używane jako parametry szablonu nietypowego. Parametr szablonu innego niż typ nie może być typem odwołania rvalue ani pakietem parametrów typów rvalue.

Poniższy przykład generuje kod C2993:

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

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

Przed MSVC 19.26 poniższy kod emitował C2993. Teraz emituje 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 {};

W przypadku języka C++17 i starszych nie można mieć parametrów szablonu bez typu zmiennoprzecinkowego. Ponieważ C++20 dozwolone są parametry szablonu bez typu zmiennoprzecinkowego. Użyj argumentu funkcji, aby przekazać parametr szablonu innego niż typ zmiennoprzecinkowy do szablonów funkcji.

Przed MSVC 19.26 poniższy kod emitował C2993. Teraz emituje 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) {}