Другие говорят, что 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();
}
И снова все в порядке с миром.