다음 코드가 있습니다.
template <typename TC>
class C
{
struct S
{
template <typename TS>
void fun() const
{}
};
void f(const S& s)
{
s.fun<int>();
}
};
// Dummy main function
int main()
{
return 0;
}
gcc 9.2와 clang (9.0)을 사용하여이를 빌드 할 때 template
키워드를 호출해야하기 때문에 컴파일 오류가 발생합니다 fun
. 클랑 쇼 :
error: use 'template' keyword to treat 'fun' as a dependent template name
s.fun<int>();
^
template
컴파일러 자체가 템플릿 자체가 아니기 때문에 fun
의 컨텍스트에서 종속 이름 이라고 생각하는 이유를 이해하지 못합니다 . 템플릿 대신 일반 클래스로 변경 하면 오류가 사라집니다. 그러나 나는 왜 처음부터 오류가 있어야하는지 알지 못합니다 .f
f
C
S
f
TC
.
이상하게도 MSVC 19.22는 이것을 잘 컴파일합니다.
노트
"템플릿"및 "typename"키워드 를 어디에 그리고 왜 사용해야 합니까? 이것은 S
실제로 종속 이름 인 f
경우에도 현재 인스턴스화의 구성원이라는 사실이 아니라면 종속되지 않는 특별한 경우를 고려하십시오 .