2009-05-20 2 views
11

Ich habe die folgende Methode Definition in meiner Klasse:Warum C++ Compiler (Gcc) denkt, Funktion ist `virtuelles 'Feld?

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

Aus irgendeinem Grund, klagt GCC dass:

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

Irgendwelche Ideen, warum es Compile würde glauben, ein Feld zu sein, statt einer Methode?

+1

Können Sie uns den Code über und unter diesem zeigen? Gab es andere Fehler? – JaredPar

Antwort

29

Ich bekomme diesen Fehler, wenn der erste Parameter keinen Sinn ergibt. Überprüfen Sie, ob Evaluator als Typ bekannt ist:

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 

Um herauszufinden, ob etwas ein Objekt oder Funktionsdeklaration ist, hat der Compiler manchmal die ganze Erklärung zu scannen. Jedes Konstrukt innerhalb der Deklaration, das möglicherweise eine Deklaration bilden könnte, wird als Deklaration betrachtet. Wenn nicht, dann wird jedes derartige Konstrukt als ein Ausdruck angesehen. GCC denkt anscheinend, weil nonsense kein gültiger Typ ist, es kann keine gültige Parameterdeklaration sein und fällt daher zurück und behandelt die gesamte Deklaration als ein Feld (beachten Sie, dass es zusätzlich error: expected ';' before '(' token) angibt. Gleiches im lokalen Bereich

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) 
Verwandte Themen