2009-05-20 4 views
11

Ho un la seguente definizione di metodo nella mia classe:Perché il compilatore C++ (gcc) pensa che la funzione sia un campo `virtuale '?

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

Per qualche ragione, GCC lamenta che:

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

Tutte le idee perché sarebbe credere Compile per essere un campo, invece di un metodo?

+1

Puoi mostrarci il codice sopra e sotto? Ci sono stati altri errori. – JaredPar

risposta

29

Viene visualizzato questo errore quando il primo parametro non ha senso. Controllare che Evaluator è conosciuto come 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 

per scoprire se qualcosa è una dichiarazione di oggetto o di una funzione, il compilatore ha a volte per la scansione di tutta la dichiarazione. Qualsiasi costrutto all'interno della dichiarazione che potrebbe formare una dichiarazione è considerato una dichiarazione. Altrimenti, qualsiasi costruzione di questo tipo è considerata un'espressione. Apparentemente GCC pensa perché nonsense non è un tipo valido, non può essere una dichiarazione di parametro valida e quindi ricade sull'intera dichiarazione come un campo (si noti che si dice inoltre error: expected ';' before '(' token). Stessa cosa in ambito locale

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)