2010-05-27 47 views
0

我該怎麼做才能編譯這個代碼,它是圍繞這條線制動的:如何在C++(C++ 0x)中使用'auto'?

auto val = what.getObject();

#include<iostream> 
using namespace std; 

class CUP{ 
    public: 
     void whatsHappening(){} 
}; 

class MUG{ 
    public: 
     void whatsHappening(){} 
}; 

class CupThrower{ 
    public: 
     CUP cp; 
     CUP getObject(){ return cp;} 
}; 

class MugThrower{ 
    public: 
     MUG mg; 
     MUG getObject(){return mg;} 
}; 

template <typename T> void whatsHappening(T what){ 

    auto val = what.getObject(); //DOES NOT COMPILE 
    val.whatsHappening(); 
} 

int main(){ 
    CupThrower ct; 
    MugThrower mt; 
    whatsHappening(ct); 
    whatsHappening(mt); 
    return 0; 
} 

我正在使用VS2008進行編譯。

+1

發佈您正在收到的實際錯誤將會很有幫助。另外,你在使用什麼編譯器? – cake 2010-05-27 21:04:36

+0

我正在使用VS2008,錯誤太長髮帖 – LoudNPossiblyWrong 2010-05-27 21:07:32

+4

VS2008不支持'auto',移動到VS2010或GCC 4.4/4.5。 – AraK 2010-05-27 21:09:05

回答

11

自動在VS2008中不受支持。使用VS2010及更高版本,或支持此功能的其他編譯器。

+0

這是編譯版本,我沒有VS2010,但我嘗試與GCC 4.4 *,它的工作。謝謝你的提示。 – LoudNPossiblyWrong 2010-05-28 04:12:07

3

Auto是隻存在於C++ 0x中的功能,因此在大多數(如果不是全部)編譯器中默認情況下未啓用。你有沒有在你的編譯器中使用適當的選項來啓用它?

+0

我正在使用visual studio 2008進行編譯,我必須使該工作成爲可能? – LoudNPossiblyWrong 2010-05-27 21:08:27

+2

@Loud:你必須啓用「升級到Visual Studio 2010」:-) – 2010-05-27 21:09:46

+0

實際上,沒有。 Auto在C標準中是可用的(因此我很確定C++)唯一的事情是它沒有任何功能。它將局部變量定義爲局部範圍...嗯...是嗎? – 2010-05-27 21:11:14

-2

它不會編譯,因爲您正在嘗試處理零大小的非函數對象。

編輯: 在VS2010中適合我。

+0

我不太確定你的意思。 – LoudNPossiblyWrong 2010-05-27 21:17:07

+0

我也沒有,但我敢肯定,這不是你的代碼不編譯的原因。 – 2010-05-27 21:23:49

+0

DeadMG在他走的時候會讓這種東西變得模糊 - 忽略。 – 2010-05-27 21:33:20

3

其他人都說auto不在VC9中,這是真實的。 auto在當前C++標準中並不意味着它在C++ 0x中的含義。在目前的標準中,它實際上意味着沒有用處。長話短說,你不能在這裏嘗試使用它的方式使用auto

但有一個選擇。在此代碼中:

template <typename T> void whatsHappening(T what){ 

    auto val = what.getObject(); //DOES NOT COMPILE 
    val.whatsHappening(); 
} 

...您遇到的問題是val是未知類型。如果TCupThrower,則getObject()返回一個CUP。同樣,對於MugThrowergetObject()返回MUG。您的代碼編寫方式,您無法僅根據T的類型知道getObject()返回的類型。所以解決方案是添加一種方法來了解它。試試這個:

class CupThrower{ 
    public: 
     typedef CUP ObjectType; 
     ObjectType cp; 
     ObjectType getObject(){ return cp;} 
}; 

class MugThrower{ 
    public: 
     typedef MUG ObjectType; 
     ObjectType mg; 
     ObjectType getObject(){return mg;} 
}; 

現在由getObject()返回的類型是封閉類的一部分。你可以改變你的whatsHappening()功能使用該信息:

template <typename T> void whatsHappening(T what){ 

    T::ObjectType val = what.getObject(); //DOES COMPILE! 
    val.whatsHappening(); 
} 

和所有是正確的與世界一次。

+0

這是很好,但我想學習如何使用C++ 0x隱式類型變量,這不回答我的問題。 – LoudNPossiblyWrong 2010-05-27 21:25:30

+0

然後刪除C++標記。 – 2010-05-27 21:26:48

+0

您需要將其更改爲'typename T :: ObjectType val = ...' – 2010-05-27 23:34:23