템플릿 클래스와 클래스 템플릿의 차이점은 무엇입니까?
답변:
이것은 많은 사람들에게 일반적인 혼란의 지점입니다 (Wikipedia의 Generic Programming 페이지, 일부 C ++ 자습서 및이 페이지의 기타 답변 포함). C ++에 관해서 는 "템플릿 클래스"와 같은 것은 없으며 "클래스 템플릿"만 있습니다. 그 문구를 읽는 방법은 "함수를위한 템플릿"인 "함수 템플릿"과는 반대로 "클래스를위한 템플릿"입니다. 다시 말하지만, 클래스는 템플릿을 정의하지 않고 템플릿은 클래스 (및 함수)를 정의 합니다. 예를 들어, 이것은 템플릿 , 특히 클래스 템플릿 이지만 클래스 는 아닙니다 .
template<typename T> class MyClassTemplate
{
...
};
선언 MyClassTemplate<int> 은 클래스 이거나 템플릿을 기반으로하는 클래스입니다. 템플릿 기반 클래스와 템플릿 기반이 아닌 클래스에는 특별한 속성이 없습니다. 특수 속성은 템플릿 자체에 있습니다.
"템플릿 클래스"라는 문구는 아무 의미가 없는데, 왜냐하면 "템플릿"이라는 단어가 C ++에 관한 한 명사 "클래스"에 적용될 때 형용사로서의 의미가 없기 때문입니다. 그것은의 존재 의미 클래스 입니다 (또는 정의)이 템플릿 C ++에 존재하는 개념이 아니다.
나는 그 단어가 실제 언어에서 "템플릿 클래스"순서로 나타나는 사실에 기반을두고 있기 때문에 일반적인 혼란을 이해합니다. 이것은 완전히 다른 이야기입니다.
차이점은 "템플릿 클래스"라는 용어가 C ++ 표준에 존재하지 않는다는 것입니다. "클래스 템플릿"이라는 용어가 혼란 스럽다고 생각하는 사람들이 주로 사용하는 용어입니다 (예 : Qt 회사 Nokia 및 이전 Trolltech).
표준은 그것에 대한 개념이 없으므로 차이를 만드는 것은 다른 사람들에게 달려 있습니다. 어떤 사람들은 이것을 동의어로 사용하고 다른 사람들은 "템플릿 클래스"라는 용어가 인스턴스화되거나 명시 적으로 특수화 된 클래스 템플릿을 나타내며 "클래스 템플릿 전문화"라는 용어와 동일하게 만듭니다. 역사적으로 그것은 이러한 의미를 가졌습니다. 주석 이 달린 참조 설명서 는 343 페이지에서 정의합니다.
클래스 템플릿에서 생성 된 클래스를 템플릿 클래스라고하며, 이름 으로 template-class-name 을 사용하여 특별히 정의 된 클래스입니다.
non-terminal template-class-name 은 오늘날 Standard에서 사용 된 non-terminal template-id 와 동일하며 아래로 내려옵니다 template-name < arguments >.
모호한 옛 용어를 사용하는 것보다 더 중요한 오늘 용어에 익숙해 지려면
// (1) defines a class template
template<typename T> class A { };
// (2) defines a class template explicit specialization
template<> class A<int> { };
// (3) defines a class template partial specialization
template<typename T> class A<T*> { };
// (4) explicitly instantiates A<char>.
template class A<char>;
// (5) implicitly instantiates A<short> (because of the member declaration)
struct D { A<short> a; };
템플릿 클래스는 템플릿 메서드 디자인 패턴 과 관련이있는 반면 클래스 템플릿은 "공백 채우기"클래스 템플릿입니다.
클래스 템플릿은 클래스를 생성하는 데 사용되는 템플릿이고 템플릿 클래스는 템플릿에 의해 생성되는 클래스입니다.
이 논문을 보세요 (wg21에서 1992 년에 출판 됨) :
일관된 용어
지금까지 많은 논쟁과 불일치는 템플릿을 설명하는 장에서 사용 된 용어와 관련되어 있습니다. 가장 빈번한 것은 다양한 아이디어와 의도를 표현하기 위해 '기능 템플릿' 과 '템플릿 기능' 을 다양하게 적용한 것입니다 . 일관된 이름 지정이 적용되지 않기 때문에 결과는 혼란과 논쟁입니다.
이 문서의 목적을 위해, 템플릿에 대한 토론에서위원회의 공식 채택을위한 제안 및 문서를 명확히하기위한 목적으로; 후행 '- 템플릿'은 템플릿이 설명하는 유형 또는 기능 집합을 설명하는 형식화를 채택 할 것을 제안 합니다. 그리고 있음을 선도하는 '템플레이트가' 하는 부분의 템플릿 정의를 설명하는 데 사용되는 '-template을' 등으로,
'template-member-function'. 따라서 :-
- 'function-template': 템플릿이 설명하는 함수 집합으로 해당 템플릿에 대한 인수로 제공되는 일부 유형 정보에 대한 매개 변수입니다. 예를 들면 :-
template<class T> int nullcheck( T* pT )
{ return ( pT != 0 ); }
- 'class-template': 템플릿이 설명하는 클래스 집합으로, 해당 템플릿에 대한 인수로 제공되는 일부 유형 정보에 대한 매개 변수입니다. 예를 들어 :-
template<class T> class S {
int i;
public:
int sep_member();
int imm_member()
{ return 2; }
}
- '템플릿 기능': 이 용어는 더 이상 허용되지 않습니다. **
'template-class': 이 용어는 허용되지 않습니다. **
'member-function-template': 이 용어는 템플릿 정의에서 현재 지원하지 않는 속성을 설명하므로 허용되지 않습니다. 위의 용어 규칙을 사용하면 정의 자체가 템플릿 인 비 클래스 템플릿의 멤버를 설명합니다. 예를 들면 :-
class Normal { public:
template<class T> int foo(T*pT)
{ return ( pT == 0 ); }
};
그러나 템플릿은 현재 전역 범위로 제한되어 있으므로 이러한 템플릿은 유효하지 않습니다.
- '템플릿 정적 멤버 함수':
- '템플릿 멤버 함수':
- '템플릿 정적 멤버':
- 'template-static-data- member'template-member ': 구성원이 속한'클래스 템플릿 '과 별도로 나타나는 구성원의 정의에 대한 대체 용어입니다. 예를 들면 :-
template<class T> int S<T>::sep_member()
{ return i; }
Normal위에서 설명한 클래스 정보 : 그러한 멤버 함수 템플릿 이 금지되어 있다는 사실을 몰랐습니다 . 내가 시도한 모든 컴파일러에서 허용됩니다. 내가 무엇을 놓치고 있습니까?