[英]C++ Error C2228 (left of '.val' must have class/struct/union) in unusual circumstances
在C ++中,我试图用C ++实现我自己的any
类。 但是,在我能够测试它之前(所以如果我的实现很糟糕,请随意纠正我),我得到了错误: error C2228: left of '.val' must have class/struct/union
两次使用该value()
error C2228: left of '.val' must have class/struct/union
value()
函数两次,当它在其他地方工作时看起来很奇怪。 我唯一能想到的是函数decltype
导致错误,但它不应该:
编辑:我更新了更改template<class T> any(TV){...}
构造函数的变量的方法
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);
}
};
你似乎对这一行有很大的误解:
T = NewT;
在C ++中, T
是模板参数,因此在编译期间它是静态的。 你不能“设置”它,因为它不是一个变量。 与C ++类型中的某些动态语言(Python,...)不同,它们不是对象,在运行时也无法修改。 您可以使用不同的类型(不同的T
s)实例化模板,但每个类似于一个单独的类(称为模板类实例化或类模板实例化,两者都是等效的),并且它独立于其他实例。
由于您的设计的其余部分基于上述错误假设,因此会遇到很多问题。 上述行没有显示为第一个错误的原因是它在代码的其他部分被编译之前甚至没有实例化(技术上:编译的不同阶段)。 也就是说,你需要理解为什么在C ++中上面的内容是不可能的,其余部分将随之而来。 您可能希望了解其他实现,如Boost.Any,以获得有关如何完成的一些想法。 (警告:它比你的方法更复杂)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.