この質問を解決するために使用したCRTP ベースのテンプレート コードを次に示します。ここにコードを投稿しますが、行は長く、codepad.org の方が読みやすいです (必要に応じてここに投稿します)。もちろん、それは機能しますが、醜く、やや人工的です。しかし、MSVC++ と GCC の両方でコンパイルされますが、一部のテンプレート タイプは実際には定義されていないことに最初は気づきませんでした。私が質問している部分は、関数の上部にあるいくつかの長い内部if( typeid( Derived(N) ) != typeid( Derived(N-1))
(記号表記)です。TBase::OnEvent
これらの型を使用することはできません。コンパイル エラーが発生します。typdef
このような長いチェーンで型を定義するための派生クラスが十分にない...::TDerived::...
ため、正しくコンパイル エラーが発生しますTDerived is not defined in TBase
。それでも、コンパイラはそれらを食べ尽くしますtypeid
。...::TDerived::...
デバッガーの MSVC++ コンパイラー出力 (完全なシンボリック情報付き) をチェックインすると、実際にはどのクラスにもならないすべての longがtypeid
、コンパイラーによって単にTDerived04
クラス チェーンの最後に解決されたようです。そして、RTTI は、...::TDerived::...
私が持っている数に関係なく、クラス チェーンの最後のクラスに対してプルされます。
MSVC++ と GCC の両方がそれを行うことを考慮して (私は codepad.org から GCC にしかアクセスできませんが)、私の質問は次のとおりtypeid
です。では、なぜtypedef
これらの long のいずれかが に...::TDerived::...
解決されないのTDerived04
でしょうか?
編集:つまり、 が に解決typedef
されないことをうれしく思います。TDerived04
typedef
typeid
typedef
編集: GCC はTDerived04::TDerived04::TDerived04::TDerived04 lD4;
変数宣言を受け入れます。そして、タイプは単にTDerived04
最後にあります。スコープの解決を折りたたむためのルールはありますか? どうやら、MSVC++ と GCC の両方が で同じことを行っているようですが、typeid
GCC とは異なり、MSVC++ は他のシナリオを処理できません。コンパイル エラーが発生し、コンストラクターの引数が必要になります。