我如何在C ++(C ++ 0x)中使用'auto'?

时间:2010-05-27 21:02:47

标签: c++ templates c++11 visual-c++-2008

我需要对此代码做什么才能使其编译,它围绕这一行制动:

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进行编译。

4 个答案:

答案 0 :(得分:11)

VS2008不支持自动。使用VS2010及更高版本或支持此功能的其他编译器。

答案 1 :(得分:3)

Auto是仅在C ++ 0x中出现的功能,因此在大多数(如果不是全部)编译器中默认不启用。您是否在编译器中使用了相应的选项来启用它?

答案 2 :(得分: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。编写代码的方式,您无法仅根据getObject()的类型知道T返回的类型。因此解决方案是添加一种了解它的方法。试试这个:

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();
}

所有这一切都与世界同在。

答案 3 :(得分:-2)

它无法编译,因为您正在尝试处理零大小的非函数对象。

编辑: 在VS2010中对我来说很好。