2009-05-18 70 views
321

我有一個帶有兩個構造函數的類,一個不接受任何參數,一個接受一個參數。錯誤:請求會員'..'在'..'中是非班級類型

使用帶有一個參數的構造函數創建對象將按預期方式工作。但是,如果我使用不帶參數的構造函數創建對象,則會出現錯誤。

舉例來說,如果我編譯這段代碼(使用G ++ 4.0.1)...

class Foo 
{ 
    public: 
    Foo() {}; 
    Foo(int a) {}; 
    void bar() {}; 
}; 

int main() 
{ 
    // this works... 
    Foo foo1(1); 
    foo1.bar(); 

    // this does not... 
    Foo foo2(); 
    foo2.bar(); 

    return 0; 
} 

...我收到以下錯誤:

nonclass.cpp: In function ‘int main(int, const char**)’: 
nonclass.cpp:17: error: request for member ‘bar’ in ‘foo2’, which is of non-class type ‘Foo()()’ 

這是爲什麼,和我如何使它工作?

+0

相關:http://stackoverflow.com/q/2318650/69537 – Meysam 2012-08-06 06:24:35

回答

501
Foo foo2(); 

變化

Foo foo2; 

你得到的錯誤,因爲編譯器認爲的

Foo foo2() 

與名稱 'foo2的' 和返回類型 '富' 函數聲明。

但是在這種情況下,如果我們更改爲Foo foo2,編譯器可能會顯示錯誤" call of overloaded ‘Foo()’ is ambiguous"

+0

我不明白爲什麼編譯器認爲:富foo2的()的函數聲明,主要的功能裏面。 – 2017-10-24 19:48:17

+0

顯然我之前就登陸過這個答案,因爲我再也無法提供它了!這是一個文本第二upvote ...和第二個謝謝! – bigjosh 2017-11-04 04:39:12

+0

無參數函數聲明應該有強制的「void」參數,以便從一致性的角度允許這種用法。如果我沒有弄錯,K&R C強制使用術語無效。 – Rajesh 2018-01-22 05:08:56

36

只是爲了記錄..

它實際上不是你的代碼的解決方案,但我有錯誤的時候訪問類實例的指向myPointerToClass,例如方法相同的錯誤信息

MyClass* myPointerToClass = new MyClass(); 
myPointerToClass.aMethodOfThatClass(); 

其中

myPointerToClass->aMethodOfThatClass(); 

顯然是正確的。

9

添加到的知識基礎,我得到了同樣的錯誤

if(class_iter->num == *int_iter) 

即使IDE給了我正確的成員class_iter。很顯然,問題是"anything"::iterator沒有一個名爲num的成員,所以我需要對其進行解引用。這不工作是這樣的:

if(*class_iter->num == *int_iter) 

...顯然。我最終解決了這個問題:

if((*class_iter)->num == *int_iter) 

我希望這可以幫助那些以我的方式來解決這個問題的人。

4

我有一個類似的錯誤,似乎編譯器誤解了沒有參數的構造函數的調用。我把它從變量的聲明是這樣去除括號,在你的代碼的東西的工作:不需要

class Foo 
{ 
    public: 
    Foo() {}; 
    Foo(int a) {}; 
    void bar() {}; 
}; 

int main() 
{ 
    // this works... 
    Foo foo1(1); 
    foo1.bar(); 

    // this does not... 
    Foo foo2; // Without "()" 
    foo2.bar(); 

    return 0; 
} 
3

括號實例化一個類的對象,當你不打算使用參數化的構造函數。

只需使用Foo foo2;

它會工作。

0

我遇到了,我得到了錯誤信息,並有

Foo foo(Bar()); 

,並基本上是試圖在一個臨時酒吧對象到富構造函數傳遞的情況。原來,編譯器翻譯這

Foo foo(Bar(*)()); 

就是一個函數聲明,其名是foo,它返回一個Foo,它接受一個參數 - 一個函數指針返回酒吧0參數。在通過像這樣的臨時工時,最好使用Bar{}而不是Bar()來消除歧義。

-1

添加我的錯誤,我已經試過:

Foo.low[i]

相反的:

Foo[i].low

0

如果你想聲明沒有參數的新物質(明知對象有默認參數)不寫

type substance1(); 

type substance; 
相關問題