クラスに次のメソッド定義があります。
virtual Calc* Compile(
Evaluator* evaluator, ResolvedFunCall* fun_call, string* error);
何らかの理由で、GCC は次のように不平を言います。
error: 'Compile' declared as a 'virtual' field
Compile がメソッドではなくフィールドであると信じる理由はありますか?
クラスに次のメソッド定義があります。
virtual Calc* Compile(
Evaluator* evaluator, ResolvedFunCall* fun_call, string* error);
何らかの理由で、GCC は次のように不平を言います。
error: 'Compile' declared as a 'virtual' field
Compile がメソッドではなくフィールドであると信じる理由はありますか?
最初のパラメーターが意味をなさない場合、そのエラーが発生します。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)