2009-05-20 19 views
11

Tengo la siguiente definición de método en mi clase:¿Por qué el compilador de C++ (gcc) piensa que la función es campo 'virtual'?

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

Por alguna razón, GCC se queja de que:

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

Cualquier idea por qué sería creer compilación tenga un campo, en vez de un método?

+1

¿Nos puede mostrar el código anterior y siguiente? ¿Hubo algún otro error? – JaredPar

Respuesta

29

Aparece ese error cuando el primer parámetro no tiene sentido. Compruebe que Evaluator se conoce como tipo:

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 

Para saber si algo es una declaración de objeto o función, el compilador a veces tiene que escanear toda la declaración. Cualquier construcción dentro de la declaración que podría formar una declaración se toma como una declaración. Si no, entonces se considera que cualquier construcción es una expresión. GCC aparentemente piensa que porque nonsense no es un tipo válido, no puede ser una declaración de parámetro válida, y por lo tanto vuelve a tratar la declaración completa como un campo (nota que dice además error: expected ';' before '(' token). Lo mismo en el ámbito 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) 
Cuestiones relacionadas