2014-01-06 51 views
4

在C++中,我试图用C++实现我自己的any类。但是,在我能够测试它之前(所以如果我的实现不好,请随时纠正我),我得到了错误:error C2228: left of '.val' must have class/struct/union两次使用两次value()函数,这似乎很奇怪,当它在其他地方工作。我能想到的唯一的事情将是decltype盈函数导致一个错误,但它不应该:在异常情况下,C++错误C2228('.val'的左边必须有class/struct/union)

编辑:我已经更新改变变量为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); 
    } 
}; 
+2

'T = NewT;'是无效的语法。 'T!= decltype(v.val)'也不是。将第二个替换为'std :: is_same :: value'。 – 2014-01-06 19:01:18

+0

你不能像这样改变模板的类型,类型是硬编码的。 – dutt

+0

'〜any(){delete&v; }'不会做你认为它所做的事情。这将尝试通过全局运算符delete来释放内存,这将会(很可能)在运行时崩溃,因为'v'没有用全局分配器new进行分配。你可能想要'v。〜variable ()',尽管在这种情况下已经完成了,因为'v'是'any'的成员变量(并且调用析构函数两次可能会导致其他运行时崩溃,尽管不太可能这个例子)。 –

回答

5

你似乎对此行的一大误区:

T = NewT; 

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

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

+0

我已经更新了我的答案,以摆脱模板错误,但仍然得到c2228错误。你能告诉我问题是什么吗? – Joe

+0

@Joe可能是视觉工作室。它在gcc中编译得很好。 – 2014-01-06 20:33:20

+0

@remyabel - 那你建议我做什么?使用GCC? – Joe

相关问题