템플릿 클래스와 클래스 템플릿의 차이점은 무엇입니까?


85

템플릿 클래스와 클래스 템플릿의 차이점은 무엇입니까?

답변:


125

이것은 많은 사람들에게 일반적인 혼란의 지점입니다 (Wikipedia의 Generic Programming 페이지, 일부 C ++ 자습서 및이 페이지의 기타 답변 포함). C ++에 관해서 는 "템플릿 클래스"와 같은 것은 없으며 "클래스 템플릿"만 있습니다. 그 문구를 읽는 방법은 "함수를위한 템플릿"인 "함수 템플릿"과는 반대로 "클래스를위한 템플릿"입니다. 다시 말하지만, 클래스는 템플릿을 정의하지 않고 템플릿은 클래스 (및 함수)를 정의 합니다. 예를 들어, 이것은 템플릿 , 특히 클래스 템플릿 이지만 클래스 아닙니다 .

template<typename T> class MyClassTemplate
{ 
    ...
};

선언 MyClassTemplate<int> 은 클래스 이거나 템플릿을 기반으로하는 클래스입니다. 템플릿 기반 클래스와 템플릿 기반이 아닌 클래스에는 특별한 속성이 없습니다. 특수 속성은 템플릿 자체에 있습니다.

"템플릿 클래스"라는 문구는 아무 의미가 없는데, 왜냐하면 "템플릿"이라는 단어가 C ++에 관한 한 명사 "클래스"에 적용될 때 형용사로서의 의미가 없기 때문입니다. 그것은의 존재 의미 클래스 입니다 (또는 정의)이 템플릿 C ++에 존재하는 개념이 아니다.

나는 그 단어가 실제 언어에서 "템플릿 클래스"순서로 나타나는 사실에 기반을두고 있기 때문에 일반적인 혼란을 이해합니다. 이것은 완전히 다른 이야기입니다.


+1. 어떤 이유로 든 클래스의 "원산지"를 구별하는 것이 유용 할 때가 있습니다.이 경우 "템플릿 클래스"라는 용어를 합리적으로 사용할 수 있습니다.하지만 제공 한 이유 때문에 이것의 의미를 신중하게 정의하는 것이 좋습니다. .
j_random_hacker

1
@j_random_hacker-아래 litb의 답변을 참조하십시오. 간단히 말해서 선호하는 용어는 "클래스 템플릿 전문화"입니다
Not Sure

@Not Sure : 실제로 "클래스 템플릿 전문화"는 템플릿에 대한 명시 적 또는 부분적 전문화를 정의하는 프로세스를 참조 할 수도 있기 때문에 약간 모호합니다. 실제 "클래스"를 생성하는 데 필요하지 않은 것입니다. :) IMHO "클래스 템플릿 인스턴스화"는 가장 명확한 용어입니다.
j_random_hacker

2
@j_random_hacker : "명시 적 클래스 템플릿 전문화"와 "부분 명시 적 클래스 템플릿 전문화"라는 적절한 용어가 있습니다. 번거롭지 만 모호하지는 않습니다. :)
확실하지 않음

1
−1 용어는 용어를 사용하는 사람들에게 의미하는 바를 의미합니다. 문자 적 의미를 분석하기 시작하는 것은 의미가 없습니다. 일상 생활이나 공학의 다른 용어로 시도하십시오. 요약하면,이 대답은 hogwash입니다. Bjarne을 인용 한 SHH의 대답 은 괜찮습니다.
건배와 hth. - 알프

13

C ++를 만든 Bjarne Stroustrup은 자신의 저서 The C ++ Programming Language 4th edition , 23.2.1 Defining a Template에서 다음 과 같이 말합니다 .

클래스 템플릿템플릿 클래스 라는 용어를 의미 론적으로 구분하는 사람들이 있습니다 . 나는하지 않는다. 너무 미묘 할 수 있습니다. 이러한 용어는 서로 바꿔서 사용할 수 있습니다. 마찬가지로, 함수 템플릿템플릿 함수 와 교환 할 수 있다고 생각 합니다 .


12

차이점은 "템플릿 클래스"라는 용어가 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; };
  • ARM은 클래스 (2)와 (4) 및 (5) 템플릿 클래스에 의해 생성 된 클래스를 호출했습니다 . ARM이 부분 전문화에 대해 이미 알고 있는지 확실하지 않습니다. 그러나 그렇다면 (3)은 템플릿 클래스라고 부르지 않았습니다. 왜냐하면 (3)은 클래스를 정의하지 않고 템플릿을 정의하기 때문입니다.
  • 현재 표준은 클래스 (2)와 (4) 및 (5) 클래스 템플릿 전문화에 의해 생성 된 클래스를 호출합니다 . 그리고 (3)은 명시 적 전문화 와 달리 부분 전문화 라고합니다 . 또한 때때로 (3) 전문화 (3.2 / 5-교차 연결을 명확히 함)라고 부르지 만, "전문화"를 "클래스, 함수 또는 클래스"로 정의하기 때문에 이것이 완전히 명확하지는 않습니다. 회원 ", (3)이 만족하지 않습니다.

3
헤헤. 예와 다른 몇몇도 여전히 그 세트에 기여합니다. 특히 C ++ Faq lite와 Qt 문서가 있습니다. faq lite의 저자는 "전문화"라는 단어를 사용하는 것이 혼동을 줄이기 때문에 (사용자가 작성한 전문화 유형에 대해 "명시 적 전문화"를 사용하여) 더 낫다고 설명하는 또 다른 FAQ 항목을 추가하고 싶다고 메일을 통해 저에게 말했습니다. 그때). Qt 직원들은 "클래스 템플릿"이라는 용어를 사용하고 싶지 않다고 말했습니다 .... 그들은 너무 "부자연 스럽다"고 생각합니다. 너무 나쁘다.
Johannes Schaub-litb

@ JohannesSchaub-litb : ARM은 대략 1991 년 IIRC 인 Bjarne Stroustrup과 Margaret Ellis가 작성했습니다. ARM 의 인용문은 Bjarne의 TCPPL 4 판에서 SHH의 인용문과 모순 됩니다. 따라서 기존 (사전 표준) 용어와 현재 용어를 구분하는 것이 좋습니다.
건배와 hth. - 알프


1

클래스 템플릿은 클래스를 생성하는 데 사용되는 템플릿이고 템플릿 클래스는 템플릿에 의해 생성되는 클래스입니다.


0

템플릿 클래스 : 일반 정의가있는 클래스 또는 클라이언트가 정보를 제공 할 때까지 인스턴스화되지 않는 매개 변수가있는 클래스입니다. 일반 templates.simply 접두사 템플릿 및 T 사용에 대한 전문 용어로 참조됩니다. 클래스 템플릿 : 클래스의 개별 구성은 클래스를 사용하여 개별 객체를 구성하는 방식과 거의 유사한 클래스 템플릿에 의해 지정됩니다. 템플릿 클래스 Ex- classname objectname (argument list)의 객체를 참조합니다.


0

클래스 템플릿은 다양한 유형의 객체에 대한 일반 클래스입니다. 기본적으로 매개 변수를 기반으로 클래스를 생성하기위한 사양을 제공합니다. 새로운 객체가 생성 될 때마다 그 목적을 위해 새로운 클래스가 메모리에서 발생합니다. 이를 클래스 템플릿 인스턴스화라고하며 클래스의 인스턴스화 된 각 버전을 템플릿 클래스라고합니다.


0

이 논문을 보세요 (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위에서 설명한 클래스 정보 : 그러한 멤버 함수 템플릿 이 금지되어 있다는 사실을 몰랐습니다 . 내가 시도한 모든 컴파일러에서 허용됩니다. 내가 무엇을 놓치고 있습니까?
dan_din_pantelimon
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.