2009-05-20 9 views
11

J'ai la définition de méthode suivante dans ma classe:Pourquoi le compilateur C++ (gcc) pense que la fonction est un champ "virtuel"?

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

Pour une raison quelconque, GCC se plaint que:

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

Toutes les idées pourquoi il croit Compile d'être un champ, au lieu d'une méthode?

+1

Pouvez-vous nous montrer le code au-dessus et au-dessous? Y avait-il d'autres erreurs? – JaredPar

Répondre

29

Je reçois cette erreur lorsque le premier paramètre n'a pas de sens. Vérifiez que Evaluator est connu comme le type:

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 

Pour savoir si quelque chose est une déclaration d'objet ou d'une fonction, le compilateur doit parfois balayer toute la déclaration. Toute construction dans la déclaration qui pourrait éventuellement former une déclaration est considérée comme une déclaration. Si non, alors une telle construction est considérée comme une expression. GCC pense apparemment parce que nonsense n'est pas un type valide, il ne peut pas être une déclaration de paramètre valide, et retombe donc en traitant la déclaration entière comme un champ (notez qu'il indique en outre error: expected ';' before '(' token). Même chose dans le champ d'application local

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)