Derleyici Hatası C2993

'identifier' : 'parameter' türü olmayan şablon parametresi için geçersiz tür

  • C++20'den önce yapı, sınıf veya birleşim bağımsız değişkenine sahip bir şablon bildiremezsiniz. İşaretçiler bu türlerin yerine şablon parametresi olarak kullanılabilir.
  • C++20 olduğundan yapı, sınıf veya birleşimler tür olmayan şablon parametreleri olarak kullanılabilir . Tür olmayan bir şablon parametresi rvalue başvuru türü veya rvalue türlerinin parametre paketi olamaz.

Aşağıdaki örnek C2993 oluşturur:

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

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

MSVC 19.26'dan önce, aşağıdaki kod C2993'i yaymıştı. Şimdi C7582 yayar:

// 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 {};

C++17 ve önceki sürümlerde kayan nokta türü olmayan şablon parametrelerine sahip olamazsınız. C++20'den bu yana kayan nokta türü olmayan şablon parametrelerine izin verilir. Kayan nokta türü olmayan şablon parametresini işlev şablonlarına geçirmek için işlev bağımsız değişkenini kullanın.

MSVC 19.26'dan önce, aşağıdaki kod C2993'i yaymıştı. Şimdi C7582 yayar:

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