代码之家  ›  专栏  ›  技术社区  ›  LoudNPossiblyWrong

如何在C++(C++0x)中使用“自动”?

  •  0
  • LoudNPossiblyWrong  · 技术社区  · 14 年前

    我要怎么处理这段代码才能编译它,它在这一行中起着刹车作用:

    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 回复  |  直到 14 年前
        1
  •  11
  •   Klaim    14 年前

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

        2
  •  3
  •   John Dibling    14 年前

    其他人说过 auto 不在VC9中,这是真的。 汽车 这并不意味着在当前的C++标准中,它在C++ 0x中意味着什么。在当前的标准中,它实际上意味着没有什么有用的东西。长话短说,你不能用 汽车 你在这里使用它的方式。

    但还有另一种选择。在本代码中:

    template <typename T> void whatsHappening(T what){
    
        auto val = what.getObject(); //DOES NOT COMPILE
        val.whatsHappening();
    }
    

    …你的问题是 val 属于未知类型。如果 T CupThrower 然后 getObject() 返回一个杯子。同样地,为了 MugThrower , GETObjutt() 返回A MUG . 代码的编写方式,您无法知道返回的类型 GETObjutt() 仅基于 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;}
    };
    

    现在返回的类型 GETObjutt() 是封闭类的一部分。你可以改变你的 whatsHappening() 使用此信息的函数:

    template <typename T> void whatsHappening(T what){
    
        T::ObjectType val = what.getObject(); //DOES COMPILE!
        val.whatsHappening();
    }
    

    世界又回到了正轨。

        3
  •  3
  •   cake    14 年前

    AUTO是一个仅存在于C++ 0x中的特性,因此在大多数编译器(如果不是全部)中都没有启用编译器。您是否在编译器中使用了适当的选项来启用它?

        4
  •  -2
  •   Puppy    14 年前

    它不会编译,因为您正试图处理零大小的非函数对象。

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