2016-07-06 7 views
3

なぜこのレポートエラー:C++のテンプレートは、ローカル変数のためにエラーを報告していない

class a { 
public: 
    void b() {this->c++;} 
}; 

int main() { 
    a var; 
} 

しかし、これではないでしょうか?それは必要がありますので、「D」型に依存しない、「」テンプレートクラス、関数「B」、または変数への少なくともアクセスである「C」という事実にもかかわらず

template <typename d> class a { 
public: 
    void b() {this->c++;} 
}; 

int main() { 
    a<int> var; 
} 

何か報告してください。

しかし、私が "var.b();"を呼び出すと、メイン関数ではエラーが発生します。

私は本当にそれを理解することはできませんが、それは簡単な質問であることを知っています。

+3

'var.b()'を呼び出すとすぐにエラーが報告されます。 – lorro

+1

このビヘイビアはむしろ便利です。たとえば、ポリシーデザインパターンの場合は必要です。https://en.wikipedia.org/wiki/Policy-based_design –

答えて

6

a<int>::b()は、それがテンプレートであるため、instantiatedではないためです。インスタンス化しようとすると、つまりvar.b();のように呼び出すと、コンパイラはエラーを吐き出します。テンプレートは「オンデマンド」でインスタンス化されること、つまりコンパイラがインスタンス化を必要とするときに理解する必要があります。さもなければ、最小限の構文検証だけが行われます。テンプレートのインスタンス化/名前検索に関する詳細はかなり複雑ですが、David VandevoodeとNicolai JosuttisのC++ Templates: The Complete Guideという本をお勧めします。

最初のコードスニペットではそうではありません。機能は最初から有効でなければなりません。

+0

よろしくお願いいたします。私はインスタンス化ビットを理解しています。なぜなら、コンパイラーがテンプレート化されたクラスや関数を使用せずにチェックするのは意味がないからです。私は、変数 "var"を宣言することによって、コンパイラはその型(int)に関してクラスの関数を検証すると考えていました(この場合、型は無関係です)。 – gmardau

+0

@Mehlins効率と正確さのバランスです。テンプレートが見た目よりも難しい(しばしば不可能である)ことを確認するには、その本(あるいはC++テンプレートの他の*正しい本)から少し読むと、その理由がわかります。 – vsoftco

関連する問題