다음 2 가지 과부하를 고려하십시오
template<typename T>
bool test() {
return true;
}
template<template<typename ...> class T>
bool test() {
return false;
}
첫 번째 클래스는 일반 클래스에서 작동하고 두 번째 클래스는 인스턴스화되지 않은 템플릿에서 작동합니다. 예를 들어 :
std::cout<<test<int>()<<std::endl; <-- this yields 1
std::cout<<test<std::list>()<<std::endl; <--this yields 0
이제 다음 템플릿 기능을 고려하십시오.
template<typename U>
bool templfun(){
struct A{
bool f(){
return test<A>(); // <-- this gives an error
}
};
return test<A>(); // <-- this is ok
}
GCC에서는 Clang이 컴파일하는 동안 모호한 과부하 해결에 오류가 발생합니다. 흥미롭게도 test ()에 대한 두 번째 호출은 오류를 생성하지 않습니다 (GCC에서도). 또한 template<typename U>
templfun 위에 있는 것을 제거하면 gcc는 불평을 멈 춥니 다.
이것은 GCC의 버그입니까, 아니면 불법 코드입니까?