Anteckning
Åtkomst till den här sidan kräver auktorisering. Du kan prova att logga in eller ändra kataloger.
Åtkomst till den här sidan kräver auktorisering. Du kan prova att ändra kataloger.
"identifierare" : ogiltig typ för mallparametern "parameter" som inte är av typen
Anmärkningar
- Innan C++20 kan du inte deklarera en mall med ett struktur-, klass- eller unionsargument. Pekare kan användas i stället för dessa typer som mallparametrar.
- Sedan C++20 kan struktur, klass eller unioner användas som mallparametrar av icke-typ. En mallparameter som inte är av typen kan inte vara en rvalue-referenstyp eller ett parameterpaket med rvalue-typer.
Examples
I följande exempel genereras C2993:
// compile with: /c and /std:c++17
template <int&& I>   // C2993
struct S1 {};
template <int&&... Is>   // C2993
struct S2 {};
Före MSVC 19.26 genererade följande kod C2993. Nu genererar den 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 {};
Med C++17 och tidigare kan du inte ha mallparametrar av typen inte flyttal. Sedan C++20 är icke-typspecifika mallparametrar i flyttal tillåtna. Använd ett funktionsargument för att skicka en flyttalstyp-icke-typ mallparameter till funktionsmallar.
Före MSVC 19.26 genererade följande kod C2993. Den genererar nu 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) {}