在C ++中,我正在尝试使用C ++实现自己的any
类。但是,在我能够测试它之前(所以如果我的实现很糟糕,请随意纠正我),我两次使用error C2228: left of '.val' must have class/struct/union
函数时出现错误:value()
两次,这看起来很奇怪它适用于其他地方。我唯一能想到的是decltype
函数前面的错误导致错误,但它不应该:
编辑:我更新了更改template<class T> any(T V){...}
构造函数
class any{
protected:
template<class T> struct variable{
public:
T val;
variable(){}
variable(T t) : val(t){}
};
variable<int> v;
public:
any(){
v.val = 0;
}
template<class T> any(T V){
variable<T> nV(V);
v = nV;
}
~any(){
delete &v;
}
decltype(v.val) value(){ // Error still here
return v.val;
}
template<class T> static any create(T V){
return any(V);
}
};
答案 0 :(得分:5)
你似乎对这一行有很大的误解:
T = NewT;
在C ++中,T
是模板参数,因此在编译期间它是静态的。你不能“设置”它,因为它不是一个变量。与C ++类型中的某些动态语言(Python,...)不同,它们不是对象,在运行时也无法修改。您可以使用不同的类型(不同的T
s)实例化模板,但每个类似于一个单独的类(称为模板类实例化或类模板实例化,两者都是等效的),并且它独立于其他实例。 / p>
由于您的设计的其余部分基于上述错误假设,因此会遇到很多问题。上述行没有显示为第一个错误的原因是它在代码的其他部分被编译之前甚至没有实例化(技术上:编译的不同阶段)。也就是说,你需要理解为什么在C ++中上面的内容是不可能的,其余部分将随之而来。您可能希望了解其他实现,如Boost.Any,以获得有关如何完成的一些想法。 (警告:这比你的方法更复杂)