5

誰かがコンパイラが次のような式をどのように処理するかについてヒントを与えることができますか

class DerivedA: public ParentTemplateClass<DerivedA>{
}

私にとっては、次のようになります。

この少年の父親はこの少年の「息子」です

つまり、親クラスの正確な「説明」を知らなくても、クラス DerivedA の「解析」をどのように完了することができるかは明らかではありません。できないようです。したがって、親クラスは子の前に処理する必要がありますが、そのような状況では、親は子に依存しています..そして私はそこで立ち往生しています。

ええ、そのようなことの使用法を説明する Web 上の記事がいくつかあり ます近くにあります。操作順序など、明確な動作記述が必要ですね。

回答: 皆さん、ありがとうございます。ええ、前方宣言の類推は、私の脳への損傷を止めるのに正当なようです。テンプレートは、その隠されたサブ言語の性質のために、私にとってまだ最先端であり、g ++ -Eだけではできません:)

4

3 に答える 3

6

コードが と言うclass DerivedAと、シンボルDerviedAが宣言されます。その時点で、テンプレート パラメーターとして使用できます。C++ コンパイラはコードに対していくつかのパスを実行するため、解析のその時点で、コンパイラは意図が正しく、最終的にはそのクラスの定義を取得すると「信じ」ます (テンプレートをインスタンス化しようとしているとき、つまり、実際にそのタイプを使用します)。そうでない場合は、その時点で文句を言います。宣言で前方宣言されたクラスを使用したが、それを使用する前に定義を提供しなかった場合、同様のことが起こります。

于 2012-09-11T12:26:18.987 に答える
3

テンプレートがインスタンス化された時点では、DerivedA不完全です; 宣言されていますが、完全には定義されていません。不完全な型はさまざまな方法で使用できます。たとえば、ポインタまたはそれらへの参照を宣言したり、関数を戻り型またはパラメータ型として宣言したりすることができます。オブジェクトを作成したり、オブジェクトから継承したり、メンバーにアクセスしたり、一般に、クラス名だけでなく、より多くの情報を必要とすることを行うことはできません。

クラステンプレートがこれらのことだけを行う限り、問題はありません。

于 2012-09-11T12:33:17.957 に答える
1

これがどのように機能するかを理解するには、Curiously Recurring Template Pattern だけでなく、一般的な 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も参照してください。

于 2012-09-11T12:31:27.193 に答える