2009-05-20 14 views
11

benim sınıfta bir aşağıdaki yöntem tanımı var:Neden C++ derleyicisi (gcc) işlevi sanal işlev alanı olduğunu düşünüyor?

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

, GCC şikayet: o Derleme yerine, bir saha olduğuna inanıyorum neden

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

Herhangi fikirleri bir yöntemin

+1

Bize bunun altında ve altında kodu gösterebilir misiniz? Başka bir hata var mıydı. – JaredPar

cevap

29

Bu parametre, ilk parametre anlam ifade etmediğinde anladım. Evaluator türü olarak biliniyor kontrol edin:

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 

şey bir nesne veya işlev bildirimi olup olmadığını öğrenmek için, derleyici bazen bütün deklarasyon taramak zorundadır. Beyannamede olabilecek ve muhtemelen bir deklarasyon oluşturabilecek herhangi bir yapı bir deklarasyon olarak kabul edilir. Eğer değilse, o zaman böyle bir yapı bir ifade olarak alınır. GCC, nonsense'un geçerli bir tür olmadığından geçerli olduğunu düşünüyor, geçerli bir parametre bildirimi olamaz ve bu nedenle tüm bildirimi bir alan olarak işleme koymaya geri düşer (ek olarak, error: expected ';' before '(' token numaralı ekte belirtin). Yerel olarak aynı şey

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)