2016-12-06 4 views
0

私はg ++(6.2.1)コンパイラの動作を偶然見つけました。場合によっては、関数の誤った定義が使用されていない場合、g ++はテンプレートクラスのエラーを無視するようです。コンパイラは、場合によってはテンプレートクラスのエラーをなぜ表示しませんか?

はのは、この例を見てみましょう:

class A 
{ 
    bool _var; 

    public: 
    void myFunc() const 
    { 
     _var = true; 
    } 
}; 

int main() 
{ 
    A a; 

    return 0; 
} 

コンパイラは、次のエラーを返します:私が期待したものである

error: assignment of member 'A::_var' in read-only object

を。今度は、クラステンプレートを作成してみましょう:これは罰金コンパイル

template <typename MyType> 
class A 
{ 
    bool _var; 

    public: 
    void myFunc() const 
    { 
     _var = true; 
    } 
}; 

int main() 
{ 
    A<int> a; 

    return 0; 
} 

、でも私たちはconstのメソッド内のメンバ変数に値を代入しようとしていると思いました。 次に、myFunc関数を使用しようとすると、コンパイラはエラーを再び表示し、コンパイルを拒否します。

どうしてですか?どのような場合でもコンパイラはエラーを見ることができますか?

ありがとうございます!

答えて

4

これはテンプレートクラスのメンバー自身がテンプレートであり、使用時にインスタンス化されるためです。また、使用されていないテンプレートは、特定のチェック(いわゆる2段階インスタンシエーション)のみを受けます。

関連する問題