12

クラスに次のメソッド定義があります。

virtual Calc* Compile(
  Evaluator* evaluator, ResolvedFunCall* fun_call, string* error);

何らかの理由で、GCC は次のように不平を言います。

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

Compile がメソッドではなくフィールドであると信じる理由はありますか?

4

1 に答える 1

33

最初のパラメーターが意味をなさない場合、そのエラーが発生します。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)
于 2009-05-20T19:09:16.660 に答える