2009-05-20 66 views
11

我有以下方法定義在我的課:爲什麼C++編譯器(gcc)認爲函數是「虛擬」字段?

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

出於某種原因,GCC抱怨說:

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

任何想法,爲什麼會相信編譯成爲一個領域,而不是的方法?

+1

你能告訴我們上面和下面的代碼嗎?有沒有其他的錯誤。 – JaredPar 2009-05-20 18:56:23

回答

29

當第一個參數對它沒有意義時,我得到該錯誤。檢查Evaluator被稱爲類型:

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 

要了解的東西是否是一個對象或函數聲明,編譯器有時不得不掃描整個聲明。聲明中可能形成聲明的任何構造都被視爲聲明。如果不是,那麼任何這樣的構造都被認爲是一種表達。 GCC顯然認爲是因爲nonsense是無效的類型,它不能作爲有效的參數聲明,因此將整個聲明視爲字段(注意它另外說error: expected ';' before '(' token)。同樣的東西在本地範圍內

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) 
相關問題