2014-01-06 50 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

相關問題