コンパイラ エラー 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) {}