2014-05-16 65 views
2

這個標題可能不完全準確 - 它是基於我對發生的事情的最佳猜測,我認爲它比「有人可以解釋這段代碼發生了什麼嗎?」更好。C++爲什麼變量是函數而不是對象?

無論如何,我有這樣的代碼:

class Class1 { }; 

class Class2 
{ 
public: 
    Class2(Class1 other){} 
}; 

void func(Class2 x){} 

int main() 
{ 
    Class2 x(Class1()); 
    func(x);    //Compile Error 

    Class1 y1; 
    Class2 y2(y1); 
    func(y2);   //Compiles fine 
    return 0; 
} 

因此,當我編譯,線標記爲 「編譯錯誤」 以g ++ 4.9提供了一個錯誤:

main.cpp: In function ‘int main()’: 
main.cpp:14:10: error: could not convert ‘x’ from ‘Class2 (*)(Class1 (*)())’ to ‘Class2’ 
    func(x); 
     ^

鐺++ 3.4.1提供了類似的錯誤。

我最好的猜測是它認爲「x」是某種函數返回一個Class2,而不是一個Class2本身,但是......爲什麼會發生這種情況?我認爲對Class1的調用會返回一些匿名的Class1,並將其傳遞給Class2的構造函數。

+0

我恢復您的編輯。請不要添加問題的答案。這就是答案。 –

+0

Okie dokie boss :-) – Hounddog

回答

4

Class2 x(Class1());是一個函數聲明,由於煩人的解析(谷歌技能在這裏派上用場)。

備選:

Class2 x((Class1())); 
Class2 x{Class1()}; 
+1

第二個是C++ 11 – vz0

+0

太棒了!在接受按鈕解鎖的11分鐘內,我會接受這個答案。謝謝你的幫助!我之前沒有聽說過「令人煩惱的解析」,但沒有具體的術語,Google解決方案有點困難:-) 再次感謝。 – Hounddog

2

這是因爲該行

Class2 x(Class1()); 

實際上而不是聲明函數的對象。這就是所謂的煩人的解析。 爲了避免這個問題,你應該寫:

Class2 x((Class1())); 

Class1 y; 
Class2 x(y); 
+0

感謝您的回答! – Hounddog

相關問題