컴파일러 오류 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) {}