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