1

C++ 표준 다음 상태 : 클래스 템플릿의 멤버 또는 네임 스페이스 범위에 나타납니다 멤버 템플릿에 대한 명시 적 전문화 선언에서클래스를 전문화하지 않은 채 멤버의 명시 적 특수화가 허용되지 않는 이유는 무엇입니까?

, 멤버 템플릿과 바깥 쪽 클래스 템플릿의 일부는 남아있을 수 있습니다 예외는 명시 적으로 클래스 템플릿을 포함하는 이 명시 적으로 특수화되지 않은 경우 클래스 멤버 템플릿을 명시 적으로 전문화하지 않습니다.. (14.7.3/16 이후 C++ 11에서 14.7.3/18 세 기준)

이 다음을 수 없음을 의미합니다 :의

template<typename T> 
class foo { 
    template<typename U> 
    void bar(); 
}; 

template<typename T> 
template<> 
void foo<T>::bar<some_type>(){ 
} 

이미있어왔다 여러 질문 이 문제와 관련된 사람들은 "표준에 의하면 그렇게 대답했습니다."라고 대답했습니다. 내가 이해할 수없는 것은이 제한이 존재하는 이유입니다. 단지 클래스에 대해 하나의 전문화가있는 경우에,

(예 T=int), 단지 회원에 대한 또 다른 전문화 (예 : U=int)는 것은 불가능하다 : 대답에 대한 존은 말하기에

+0

대략 추측 :'T = int'와'U'에 대한 전문화가 불특정화되고'U = int', 특수화되지 않은'T'가 존재한다면,'T = int ''U = int'? – JohnB

+0

아, 이제 바보 같은 느낌이 들지 ... – Soliter11

+0

질문에 대답해야합니까,하고 싶습니까? – Soliter11

답변

0

감사합니다 어떤 전문화를 사용할 것인지 결정하십시오. skyjpack에 의해

또 다른 점은 :

멤버 함수가없는 수준의 전문화가있을 수 있습니다.

0

템플릿 함수는 처음 사용되거나 특수화 될 때 인스턴스화됩니다.

부분 특수화를 수행 할 때 여전히 템플릿 기능이므로 함수를 인스턴스화 할 수 없습니다. 따라서 전문화 작업을 수행 할 때 컴파일러는 어떻게 든 부분적으로 인스턴스화했으며 인스턴스화와 일치시켜야한다는 것을 이해해야합니다. 이로 인해 어려움이 발생할 수 있습니다.

사람들은 의견에서 모호성을 초래할 수 있다고 말하지만, 많은 일은 모호한 것으로 이어질 수 있습니다. 예를 들어, 오버로드 된 함수를 생각해보십시오. 호출 할 함수가 오버로드 된 경우 모호한 경우 컴파일러에서 알려줍니다. 이 경우에도 마찬가지입니다.

+0

비슷한 질문 ("템플릿 인자 공제가 생성자에서 작동하지 않는 이유는 무엇입니까")를 보았습니다. 모호하기 때문에 허용되지 않습니다. 나는 단지 어떤 상황이 모호함을 가져올 수 있는지 알고 싶었습니다. – Soliter11

+0

또한 부분적인 전문화가 아닌 명시 적 (전체) 전문화에 대해 묻고 싶지만 귀하의 요점을 알고 있습니다. – Soliter11

관련 문제