다음을 통해 공유


컴파일러 오류 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";
}

참고 항목

/permissive- (표준 규칙)
종속 형식의 이름 확인
템플릿 및 이름 확인
typename