0

重複の可能性:
2 フェーズ ルックアップ - 説明が必要

テンプレート クラスを使用しているときに、#include がないというエラーや警告がコンパイラに表示されません。

たとえば、「A」というクラスがあり、次のように見えるとします。

template<class T>
class A {
    void print() const {cout << "Hey I didn't use include for 
                                 iostream and It works just fine!!!";}
};

テンプレート < class T > を削除すると、<iostream >include がないというエラーが発生します。

テンプレート クラスを使用しているときにコンパイラがこれらのエラーを表示しないのはなぜですか?

指摘しておくと、それが機能すると言うとき、つまり、クラスを作成しているときにコンパイルエラーは表示されませんが、エラーがすぐに表示されるのに対し、非テンプレートクラスとは対照的に、それを使用する場合にのみ表示されます。

4

2 に答える 2

2

テンプレート コードを記述する場合、このクラスのインスタンスを作成する場合にのみ、大量の構文チェックが行われます。使用されない場合は、チェックされません。

これを確認するには、次の行を最後に追加します。A<int>;

詳細については、2 フェーズ ルックアップ - jrok が指摘するように説明が必要です。

編集:

リンクされた投稿は興味深い点をもたらします。これは、インスタンス化がなくてもgccと clang でエラーになります。私と同じように、あなたは MSVC++ を使用していると思います

于 2013-01-16T09:51:10.557 に答える
1

コンパイラが最初にテンプレートを解析するときは、最も基本的な構文チェックと非依存型 (テンプレート引数に関して定義されていない型) の型チェックのみを実行する必要があります。完全に特殊化されたテンプレート化された型の各メンバー関数について、依存型 (テンプレート引数に依存する型) のすべての型チェックは、その関数を使用する式に最初に遭遇したとき (たとえば、それを呼び出すことによって) のみ実行する必要があります。これは、テンプレート化された型の (特定の特殊化のために) 使用しないメンバー関数は、完全にコンパイルされていない可能性があることも意味します。

これは 2 フェーズの名前ルックアップと呼ばれ、(他の回答で述べたように) ここで詳細を確認できます: 2 フェーズ ルックアップ

于 2013-01-16T09:59:53.373 に答える