0

我必须对这段代码做些什么才能使其编译,它正在这条线附近刹车:

自动验证 = 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

4 回答 4

11

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

于 2010-05-27T21:12:07.793 回答
3

自动是仅存在于 C++0x 中的功能,因此在大多数(如果不是全部)编译器中默认不启用。您是否在编译器中使用了适当的选项来启用它?

于 2010-05-27T21:05:36.050 回答
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()返回 a 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();
}

世界再次一切正常。

于 2010-05-27T21:22:40.733 回答
-2

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

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

于 2010-05-27T21:08:47.800 回答