編譯器錯誤 C2993

'identifier' : 非類型範本參數 'parameter' 的不合法類型

  • 在 C++20 之前,您無法宣告具有結構、類別或等位引數的範本。 指標可用來取代這些類型做為範本參數。
  • 由於 C++20,結構、類別或等位 可以 做為非類型範本參數使用。 非類型樣板參數不能是右值參考型別或右值型別的參數套件。

下列範例會產生 C2993:

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

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

在 MSVC 19.26 之前,下列程式碼發出 C2993。 它現在會發出 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 {};

使用 C++17 和更早版本時,您無法有浮點非類型範本參數。 由於 C++20,允許浮點非類型樣板參數。 使用函式引數將浮點非類型範本參數傳遞至函式範本。

在 MSVC 19.26 之前,下列程式碼發出 C2993。 它現在會發出 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) {}