다음은이 질문을 해결하기 위해 사용했던 CRTP based template code입니다 : Requiring overridden virtual functions to call base implementations. 여기에 코드를 게시 하겠지만, 코드 페이지는 길고 읽기 쉽습니다 (필요한 경우 여기에 게시 할 예정입니다). 그것은 추악하고 다소 인공적입니다. 물론 작동합니다. 그러나 처음에는 MSVC++ 및 GCC 모두에서 컴파일되지만 일부 템플릿 유형은 실제로 정의되지 않았습니다. 내가 심문하는 부분은 TBase::OnEvent
기능의 긴 내면 if(typeid(Derived(N)) != typeid(Derived(N-1))
(기호 표기법) 몇 개가 맨 위에 있습니다.컴파일러는`typeid` 연산자를 어떻게 평가합니까?
당신은하지 typdef
이러한 유형은 컴파일 오류가있을 것입니다 수 있습니다 - 당신이 얻을 것이다, 그래서 같은 긴 ...::TDerived::...
체인으로 정의되는 유형에 대한 충분한 파생 클래스가 컴파일 오류 TDerived is not defined in TBase
, 올바르게, 단순히 없다. 그러나 컴파일러는 typeid
을 통해 이들을 먹습니다. 디버거 MSVC++ 컴파일러 출력 (전체 기호 정보 포함)을 검사했을 때, 실제로는 어떤 클래스도 생성하지 않아야하는 모든 길이가 ...::TDerived::...
인 것으로 보입니다. typeid
은 클래스 체인의 마지막 TDerived04
으로 컴파일러에서 해결되었습니다. 그리고 RTTI는 클래스 체인에서이 마지막 클래스를 위해 풀려났습니다. 얼마나 많은 ...::TDerived::...
이 있든 상관하지 않습니다.
MSVC++ 및 GCC 모두 (codepad.org를 통해 GCC에 액세스 할 수 있음에도 불구하고) 다음을 고려하면 다음 질문에 답할 수 있습니다. typeid
의 동작을 어떻게 정의합니까? 그렇다면 왜 typedef
길이가 ...::TDerived::...
이 되니 TDerived04
으로 해결되지 않습니까?
편집 : 내 말은, 내가 typedef
이 TDerived04
에 해결되지 않는 행복 해요, 즉 typedef
를 사용하는 사람에게 재앙이 될,하지만 왜 이러한 불일치 typeid
와 typedef
사이의 것?
EDIT : GCC는 TDerived04::TDerived04::TDerived04::TDerived04 lD4;
변수 선언을 허용합니다. 그리고 형식은 결국 TDerived04
입니다. 스코프 해상도를 축소하는 규칙이 있습니까? 분명히 MSVC++와 GCC 모두 typeid
에서 동일하게 보이지만 GCC와는 달리 MSVC++는 다른 시나리오를 처리 할 수 없습니다. 컴파일러 오류가 발생하여 생성자에 대한 인수가 필요합니다.
코드를 한눈에 살펴본 후 가상 함수를 "다시 구현"하려고하는 것처럼 보입니다. 또는 나는 무엇인가 놓치고 있냐? – elmo
@elmo 글쎄, CRTP는 "컴파일 타임에 해결 된 가상 메커니즘"을 구현할 수 있습니다. 실제로 가상 함수와 관련된 질문에 대답하고있었습니다. 구체적으로, base-derived00-derived01 ...- derivedLast 체인의 중간 클래스에있는 모든 함수에 대한 호출을 구현하는 데 이러한 클래스 중 하나에서 실제 함수 호출을 지정하지 않고 (원래의 질문을 참조하십시오.) ... 그러나 여기에는 문제가되지 않습니다. , 그것은 단지 프레임 워크입니다. 나는'typeid' 행동에 대해 궁금합니다. – lapk
[this] (http://codepad.org/OlSwkfHc)가 문제를 해결합니까? 일반적으로 나는 typeid를 디버깅 용으로 만 사용하는 것을 고려할 것이다. – elmo