在异常情况下,C++错误C2228('.''的左边必须有class/struct/union)

Joe*_*Joe 4 c++ struct decltype any c++11

在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);
    }
};
Run Code Online (Sandbox Code Playgroud)

Dan*_*rey 5

你似乎对这一行有很大的误解:

T = NewT;
Run Code Online (Sandbox Code Playgroud)

在C++中,它T是一个模板参数,因此在编译期间它是静态的.你不能"设置"它,因为它不是一个变量.与C++类型中的某些动态语言(Python,...)不同,它们不是对象,在运行时也无法修改.您可以使用不同的类型(不同的Ts)实例化模板,但每个类似于一个单独的类(称为模板类实例化或类模板实例化,两者都是等效的),并且它独立于其他实例.

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