我需要对此代码做什么才能使其编译,它围绕这一行制动:
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进行编译。
答案 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
属于未知类型。如果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 :(得分:-2)
它无法编译,因为您正在尝试处理零大小的非函数对象。
编辑: 在VS2010中对我来说很好。