2010-05-27 95 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