gpt4 book ai didi

异常情况下的 C++ 错误 C2228( '.val' 左侧必须有类/结构/union )

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:45:18 29 4
gpt4 key购买 nike

在 C++ 中,我正在尝试实现自己的 any使用 C++ 的类。然而,在我能够对其进行测试之前(如果我的实现不好,请随时纠正我),我得到了错误: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);
}
};

最佳答案

你好像对这行有很大的误解:

T = NewT;

在 C++ 中,T 是一个模板参数,因此在编译期间它是静态的。您不能“设置”它,因为它不是变量。与某些动态语言(Python,...)不同,C++ 中的类型不是对象,不能在运行时修改。你可以用不同的类型(不同的T)来实例化模板,但是每一个都像是一个单独的类(称为模板类实例化或类模板实例化,两者是等价的)并且彼此独立实例。

由于您的其余设计基于上述错误假设,因此您会遇到很多问题。上面一行没有显示为第一个错误的原因是它甚至没有在代码的其他部分被编译之前实例化(技术上:编译的不同阶段)。也就是说,您需要了解为什么上述内容在 C++ 中是不可能的,其余的将随之而来。您可能想研究其他实现,例如 Boost.Any,以获得有关如何完成它的一些想法。 (警告:它比你的方法更复杂)

关于异常情况下的 C++ 错误 C2228( '.val' 左侧必须有类/结构/union ),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20957162/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com