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

标签 c++ c++11 struct decltype any

在 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/

相关文章:

c++ - C 或 C++ 是否保证 array < array + SIZE?

c++ - static constexpr 类成员变量对多线程读取安全吗?

python - 使用 Python 结构模块解压 C 结构

json - 在 Matlab 结构体的字段名称中使用句点

c++ - 良好做法:如何定义外部库的编译路径

c++如何阻止我的循环吐出最后一次输入两次

c++ - 尝试理解编译器错误信息 : default member initializer required before the end of its enclosing class

C++ 标准 : do namespace-scoped constexpr variables have internal linkage?

c++ - 如何使 C++ 模板函数与返回类型无关以供将来专门化

struct - 使用结构存储对非复制值的引用