2009-05-20 11 views
11

mam następującą definicję metody w mojej klasie:Dlaczego funkcja kompilatora C++ (gcc) uważa się za pole "wirtualne"?

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

Z jakiegoś powodu GCC narzeka, że:

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

Jakieś pomysły dlaczego to uwierzyć kompilacji być pole, zamiast metody?

+1

Czy możesz pokazać kod powyżej i poniżej? Czy są jakieś inne błędy. – JaredPar

Odpowiedz

29

Otrzymuję ten błąd, gdy pierwszy parametr nie ma dla niego sensu. Sprawdź, Evaluator znany jest jako typ:

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 

Aby dowiedzieć się, czy coś jest deklaracja obiektu lub funkcji, kompilator musi czasami skanować całą deklarację. Wszelkie konstrukcje w deklaracji, które mogłyby ewentualnie stanowić deklarację, uważa się za deklarację. Jeśli nie, to każdy taki konstrukt jest uważany za wyrażenie. GCC najwyraźniej uważa, że ​​ponieważ nonsense nie jest poprawnym typem, nie może być prawidłową deklaracją parametru, a tym samym cofa przetwarzanie całej deklaracji jako pola (zauważ, że dodatkowo jest to error: expected ';' before '(' token). To samo dotyczy lokalnego zakresu:

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) 
Powiązane problemy