2009-05-20 18 views
11

私は私のクラスに次のメソッドの定義を持っている:なぜC++コンパイラ(gcc)は関数が `virtual 'フィールドだと思いますか?

何らかの理由
virtual Calc* Compile(
    Evaluator* evaluator, ResolvedFunCall* fun_call, string* error); 

は、GCCは、その文句を言う:それはコンパイルではなく、フィールドであることを信じる理由を

error: 'Compile' declared as a 'virtual' field

任意のアイデアを方法の?

+1

このコードを上と下に表示できますか?それ以外のエラーはありましたか? – JaredPar

答えて

29

最初のパラメータが意味をなさないときは、このエラーが発生します。 Evaluatorがタイプとして知られていることを確認します。

struct A { 
    virtual void* b(nonsense*, string*); 
}; 

=> error: 'b' declared as a 'virtual' field 

struct A { 
    virtual void* b(string*, nonsense*); 
}; 

=> error: 'nonsense' has not been declared 

は何かがオブジェクトまたは関数の宣言であるかどうかを調べるには、コンパイラが時々宣言全体をスキャンする必要があります。宣言を構成する可能性のある宣言内の構造体は、宣言とみなされます。もしそうでなければ、そのような構成体はいずれも式とみなされる。 GCCは明らかにnonsenseが有効な型ではないと考えています。これは有効なパラメータ宣言ではないため、宣言全体をフィールドとして処理します(さらにerror: expected ';' before '(' tokenと記載されています)。ローカルスコープ内で同じこと

int main() { 
    int a; 

    // "nonsense * a" not treated as declaration 
    void f(nonsense*a); 
} 

=> error: variable or field 'f' declared void 

int main() { 
    // "nonsense * a" treated as parameter declaration 
    typedef int nonsense; 
    void f(nonsense*a); 
} 

=> (compiles successfully) 
関連する問題