Megjegyzés
Az oldalhoz való hozzáféréshez engedély szükséges. Megpróbálhat bejelentkezni vagy módosítani a címtárat.
Az oldalhoz való hozzáféréshez engedély szükséges. Megpróbálhatja módosítani a címtárat.
"identifier" : érvénytelen típus a típus nélküli sablonparaméter 'parameter' számára
Megjegyzések
- A C++20 előtt nem deklarálhat struktúrát, osztályt vagy egyesítő argumentumot tartalmazó sablont. Az ilyen típusok helyett mutatók is használhatók sablonparaméterekként.
- Mivel a C++20, a struktúra, az osztály vagy az egyesítők nem típusú sablonparaméterekként használhatók. A nem típusú sablonparaméterek nem lehetnek rvalue referenciatípusok vagy rvalue-típusok paramétercsomagja.
Példák
Az alábbi példa c2993-at hoz létre:
// compile with: /c and /std:c++17
template <int&& I> // C2993
struct S1 {};
template <int&&... Is> // C2993
struct S2 {};
Az MSVC 19.26 előtt a következő kód kibocsátotta a C2993-at. A következő C7582-t bocsátja ki:
// 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 {};
A C++17-es és korábbi verziókban nem lehetnek lebegőpontos nem típusú sablonparaméterek. A C++20 óta a lebegőpontos nem típusú sablonparaméterek engedélyezettek. Függvényargumentum használatával adja át a lebegőpontos nem típusú sablonparamétert a függvénysablonok számára.
Az MSVC 19.26 előtt a következő kód kibocsátotta a C2993-at. A következő C7582-t bocsátja ki:
// 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) {}