컴파일러 오류 C2993

'identifier': 형식이 아닌 템플릿 매개 변수 'parameter'의 형식이 잘못되었습니다.

  • C++20 이전에는 구조체, 클래스 또는 공용 구조체 인수를 사용하여 템플릿을 선언할 수 없습니다. 이러한 형식 대신 포인터를 템플릿 매개 변수로 사용할 수 있습니다.
  • C++20부터 구조체, 클래스 또는 공용 구조체를 형식이 아닌 템플릿 매개 변수로 사용할 수 있습니다 . 형식이 아닌 템플릿 매개 변수는 rvalue 참조 형식 또는 rvalue 형식의 매개 변수 팩일 수 없습니다.

다음 샘플에서는 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) {}