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