컴파일러 오류 C7510
'type-name': 종속 템플릿 이름 사용의 접두사는 'template'이어야 합니다.
'type-name': 종속 형식 이름 사용 앞에 'typename'을 지정해야 합니다.
모드에서 /permissive-
컴파일러는 종속 nested-name-specifier
템플릿 이름 다음에 오는 경우 템플릿 이름 앞에 키워드(keyword) 필요합니다 template
. 에 의해 정규화된 형식에 대해 유사한 규칙이 유지됩니다 typename
.
설명
컴파일러 동작은 Visual Studio 2017 버전 15.8부터 모드에서 /permissive-
변경되었습니다. 컴파일러는 종속nested-name-specifier
된 템플릿이나 typename
형식 이름 앞에 오는 키워드(keyword) 필요합니다template
. 자세한 내용은 종속 형식 및 템플릿 및 이름 확인에 대한 이름 확인을 참조하세요.
예제
모드에서 /permissive-
다음 코드는 이제 C7510을 발생합니다.
template<typename T> struct Base
{
template<class U> void example() {}
};
template<typename T>
struct X : Base<T>
{
void example()
{
Base<T>::example<int>(); // C7510: 'example': use of dependent
// template name must be prefixed with 'template'
// note: see reference to class template instantiation
// 'X<T>' being compiled
}
};
이 오류를 해결하려면 다음 예제에서 표시된 대로 template
키워드를 Base<T>::example<int>();
문에 추가합니다.
template<typename T> struct Base
{
template<class U> void example() {}
};
template<typename T>
struct X : Base<T>
{
void example()
{
// Add template keyword here:
Base<T>::template example<int>();
}
};
Visual Studio 2019 이상 /std:c++20
에서는 문이 있는 if constexpr
함수 템플릿 본문에 추가 구문 분석 관련 검사 사용하도록 설정되어 있습니다. 예를 들어 Visual Studio 2017에서 다음 코드는 옵션이 설정된 경우에만 C7510을 /permissive-
생성합니다. Visual Studio 2019에서는 /permissive
옵션이 설정된 경우에도 동일한 코드에서 오류가 발생합니다.
// C7510.cpp
// compile using: cl /EHsc /W4 /permissive /std:c++latest C7510.cpp
#include <iostream>
template <typename T>
int f()
{
T::Type a; // error C7510: 'Type': use of dependent type name must be prefixed with 'typename'
// To avoid the error, add the 'typename' keyword. Use this declaration instead:
// typename T::Type a;
if constexpr (a.val)
{
return 1;
}
else
{
return 2;
}
}
struct X
{
using Type = X;
constexpr static int val = 1;
};
int main()
{
std::cout << f<X>() << "\n";
}