Как использовать «авто» в C ++ (C ++ 0x)? - PullRequest
0 голосов
/ 28 мая 2010

Что мне нужно сделать с этим кодом, чтобы он компилировался, он торчит по этой строке:

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 ]

11 голосов
/ 28 мая 2010

Авто не поддерживается в VS2008. Используйте VS2010 и более поздние версии или другой компилятор, поддерживающий эту функцию.

3 голосов
/ 28 мая 2010

Другие говорят, что auto нет в VC9, что вроде как правда. auto не означает в текущем Стандарте C ++ то, что это означает в C ++ 0x. В текущем стандарте это фактически ничего не значит полезного. Короче говоря, вы не можете использовать auto так, как вы пытаетесь использовать его здесь.

Но есть альтернатива. В этом коде:

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

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

... проблема в том, что val неизвестного типа. Если T равно CupThrower, то getObject() возвращает CUP. Аналогично, для MugThrower, getObject() возвращает 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 голосов
/ 28 мая 2010

Авто - это функция, присутствующая только в C ++ 0x, и поэтому не включена по умолчанию в большинстве (если не во всех) компиляторах. Использовали ли вы соответствующие параметры в вашем компиляторе, чтобы включить его?

0 голосов
/ 28 мая 2010

Он не компилируется, потому что вы пытаетесь работать с не функциональными объектами нулевого размера.

Edit: У меня отлично работает в VS2010.

...