2012-09-11 2 views
5

C++ 템플릿 코드 순서 구문 분석/CRTP

클래스 DerivedA의 "구문 분석"이 부모 클래스의 정확한 "설명"을 알지 못하고 어떻게 완료 될 수 있는지는 분명치 않습니다. 그것이 '할 수 없다. 그래서 부모 클래스는 아이들보다 먼저 처리되어야하지만, 그런 상황에서는 부모가 아이들에 의존합니다. 그리고 저는 거기에 머물러 있습니다.

그래, 웹상에 그런 물건의 사용법을 설명하는 기사가 있습니다. Curiously Recurring Template Pattern ( http://en.wikibooks.org/wiki/More_C++_Idioms/Curiously_Recurring_Template_Pattern)에 대한 기사가 있지만, 그 어떤 종류의 스탠드 아트 나 스턴스와는 거리가 멀다. 작업 순서와 같은 명확한 동작 설명이 있어야합니까?

답변 됨 : 모두에게 Thnx. Yeah forward analog 유추는 내 두뇌 손상을 막기 위해 합법적 인 것처럼 보입니다. 템플릿은 숨겨진 하위 언어 특성으로 인해 여전히 예술 상태입니다. g ++ -E :

+1

마치 앞의 선언처럼 생각하면됩니다. – PlasmaHH

+0

나는 이것을 "아들의 아버지는이 특정한 아들의 관점에서 정의된다고 생각한다.CRTP의 팬은 아니지만 과도하게 사용 된 것으로 판단됩니다. 그러나 특정 CRTP 코드의 해석은 비교적 간단합니다. 템플릿은 입력 된 객체를 인스턴스화하기 전에 항상 완전히 확장됩니다. – aSteve

+0

"템플릿은 항상 완전히 확장되기 전에 형식화 된 객체를 인스턴스화 할 수 있습니다. "예, 합법적 인 것 같습니다. 템플리트는 컴파일 중에 인스턴스화되고 전처리되지 않기 때문에 내게 흐림 효과가 발생합니다. – sohel

답변

6

코드 뒤에 class DerivedA이 표시되면 DerviedA 기호가 선언됩니다. 이 지점에서 템플릿 매개 변수로 사용할 수 있습니다. C++ 컴파일러는 코드에 대해 여러 번 통과하므로 컴파일러는 구문 분석에서 그 시점에서 의도가 정확하고 결국 해당 클래스의 정의를 가져올 것이라고 "믿는다"(템플릿을 인스턴스화하려고 할 때, 실제로는 그 유형을 사용하십시오). 그렇지 않다면, 그 시점에서 불평 할 것입니다. 앞으로 선언 된 클래스를 선언문에서 사용했지만 정의를 사용하지 않은 경우에도 비슷한 결과가 발생합니다.

1

이것이 어떻게 작동하는지 이해하는 것이 좋겠지 만, 일반적으로 이상하게 반복되는 템플릿 패턴보다는 C++ 템플릿에 대해 더 많이 이해할 필요가 있습니다. 누군가 다른 사람이 나보다 잘 대답 할 수는 있지만 C++이 템플릿 클래스 정의를 완전히 파싱 할 수는 없다는 것을 알고 있습니다. 코드에서 사용될 때마다 템플릿을 인스턴스화합니다. 각 클래스는 별도의에있는 경우 파일을 포함, 이런 식으로 생각 : 그것은 템플릿 정의를 볼 때

#include "ParentTemplateClass.h" // C++ initially validates the template class definition's syntax. 
#include "DerivedA.h" // First use of ParentTemplateClass - 
         // at this point it becomes fully instantiated. 

는 C++ 파서가 처음에 템플릿의 구문을 확인합니다. 그런 다음 템플릿이 DerivedA의 기반으로 사용될 때 구문 분석이 계속되고 템플릿이 완전히 인스턴스화됩니다. 물론 이것은 C++ 컴파일러가 수행 할 구문 분석의 단순화 된보기이며 컴파일러별로 세부 사항이 다를 수 있습니다. http://womble.decadent.org.uk/c++/template-faq.html#disambiguation을 참조하십시오.

3

템플릿이 인스턴스화 될 시점에 DerivedA이 불완전한입니다. 으로 선언되었지만 완전히 으로 정의되지 않았습니다.으로 정의되었습니다. 불완전한 유형은 다양한 방법으로 사용될 수 있습니다. 예를 들어, 포인터 또는 참조를 선언하고 리턴 또는 매개 변수 유형으로 함수를 선언 할 수 있습니다. 개체를 만들거나 상속하거나 멤버에 액세스하거나 일반적으로 클래스 이름 이외의 정보를 필요로하는 것은 수행 할 수 없습니다.

클래스 템플릿에서 이러한 작업 만 수행하면 문제가 없습니다.