編譯器錯誤 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) {}