2017-02-02 9 views
1

私はC++を初めて使っていて、今はテンプレートを使っていて、この質問に遭遇しました。テンプレートを使用したC++ヘッダのオーダー

テンプレートタイプに別のクラスが必要な場合、ヘッダーのインクルード注文の特定の要件がありますか?このよう

vector<string> stringVector; 

:私たちは前vectorからstringを含める必要がありますか?

私はこれを読んで(C++ Header order)、それはヘッダーファイルがクラス要求の順序に含まれるべきだと言っています。

しかし、この(Template Compilation)が示し、またはそれは私の誤解である場合には、「コンパイラは、テンプレートクラスのインスタンス化に与えられた特定のタイプのためのコードを生成」、と私は、これは我々がインスタンス化されたときにことを意味だと思うようstringVector、コンパイラはすでにに含まれていますので、vectorここにはstringが必要です。

どの解釈が正しいのですか、私の解釈のどの部分が正しいか間違っていますか?ありがとう。

答えて

3

テンプレートをC++で使用するときは、使用するテンプレートタイプを完全型とし、string型のベクトルを使用する場合は文字列クラスを含める必要があります。インクルードはインクルードされた場所にインクルードされたファイルのコードをコピーして貼り付けるだけです。

1> #include <string> 
2> #include <vector> 
3> 
4> class Foo { 
5> private: 
6>  vector<string> bar;  
7> } 

線6をコンパイルするとき、コンパイラは完全型(そのテンプレートなぜならストリング、そのないポインタためのベクター)としての両方のタイプを知る必要があります。インクルードはクラスの上に置かれるため、コンパイラは6行目をコンパイルしたいときに両方の型を認識します。どのような順序でインクルードしても問題ありません。

1

基本的には、すべての依存関係を使用する前に含める必要があります。 文字列またはベクトルが最初に含まれている場合は、この例では問題になりません。それらを使用する前に、両方を含める必要があります。

ヘッダーファイルが互いに依存している場合は、順序が重要です。ヘッダファイルa.hとb.hがあり、b.hはa.hから依存しているとします。それから最初にa.hをインクルードする必要があります。しかし、誰かがそうする必要がある場合、プログラムはきれいな方法で書かれていません。ヘッダーファイルのすべての依存関係は、インクルードガードを使用してヘッダーファイルに含める必要があります。

これは私がそれを理解する限りです。

+0

ありがとうございます。重要なことは:「誰かがそうする必要がある場合、プログラムはきれいに書かれていません」 – Janis

関連する問題