Megosztás a következőn keresztül:


C2993 fordítóhiba

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