Sdílet prostřednictvím


Chyba kompilátoru C2993

'identifier' : neplatný typ pro parametr šablony bez typu 'parameter'

  • Před C++20 nelze deklarovat šablonu pomocí struktury, třídy nebo sjednocovacího argumentu. Ukazatele lze místo těchto typů použít jako parametry šablony.
  • Vzhledem k tomu, že C++20, struktura, třída nebo sjednocení lze použít jako parametry šablony bez typu. Parametr šablony bez typu nemůže být referenčním typem rvalue ani balíčkem parametrů typů rvalue.

Následující ukázka vygeneruje C2993:

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

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

Před MSVC 19.26 následující kód vygeneruje C2993. Teď generuje 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 {};

U C++17 a starších verzí není možné mít parametry šablony s plovoucí desetinou čárkou. Vzhledem k tomu, že C++20, jsou povoleny parametry šablony s plovoucí desetinou čárkou bez typu. K předání parametru šablony bez typu s plovoucí desetinou čárkou do šablon funkcí použijte argument funkce.

Před MSVC 19.26 následující kód vygeneruje C2993. Teď generuje 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) {}