2010-06-10 72 views
6

所以我試圖讓這對GCC編寫一些代碼編譯上的Visual Studio 2008年我有我已經縮小到這是一個問題:爲什麼這個類的聲明不是Visual Studio的工作

class value_t 
{ 
public: 
    typedef std::deque<value_t>   sequence_t; 
    typedef sequence_t::iterator  iterator; 
}; 

此代碼失敗:

1>cpptest.cpp 
1>c:\program files\microsoft visual studio 9.0\vc\include\deque(518) : error C2027: use of undefined type 'value_t' 
1>  c:\temp\cpptest\cpptest.cpp(10) : see declaration of 'value_t' 
1>  c:\temp\cpptest\cpptest.cpp(13) : see reference to class template instantiation 'std::deque<_Ty>' being compiled 
1>  with 
1>  [ 
1>   _Ty=value_t 
1>  ] 
1>c:\program files\microsoft visual studio 9.0\vc\include\deque(518) : error C2027: use of undefined type 'value_t' 
1>  c:\temp\cpptest\cpptest.cpp(10) : see declaration of 'value_t' 

然而,當我嘗試用這個的std ::向量,它編譯罰款:

class value_t 
{ 
public: 
    typedef std::vector<value_t>  sequence_t; 
    typedef sequence_t::iterator  iterator; 
}; 

瓦在錯誤?我曾嘗試在我能想到的任何地方添加'typename',但此時我認爲這只是Dinkumware STL中的一個錯誤。任何人都可以解釋發生了什麼,和/或提供解決方案?謝謝。

+1

「你能想到的地方」是否包含'typedef typename sequence_t :: iterator iterator;'? – Stephen 2010-06-10 18:46:23

+0

您可以在類聲明前嘗試前向聲明。即class_value_t; – 2010-06-10 18:46:36

+0

好吧,這總是發生 - 我發佈這個問題後,我發現在谷歌魔術組合給我一些相關的東西。參見http://www.gamedev.net/community/forums/topic.asp?topic_id=295828其中討論了這個主題;仍然不提供解決方案。有人可以證實,在這種情況下使用deque是非標準的嗎?有沒有辦法讓這個工作不需要更改文件? – Roel 2010-06-10 18:46:48

回答

7

它的未定義的行爲。查看CLC++ this鏈接主持

丹尼爾·K公司的回答剪斷: - 。

C++標準(包括C++ 03和 的C++ 0x)說,你正在嘗試 原因未定義行爲,參見 [lib.res.on.functions]/2:

「特別地,所述效果是 未定義在下列情況下: [..] - 如果一個不完整的類型(3.9)是 用過作爲模板參數時 實例化模板組件。「

+0

謝謝,那個線程解釋了我最想要的細節。猜猜我必須更改代碼。 – Roel 2010-06-10 19:00:51

1

您正試圖在模板中使用自己的類。它如何解決這個問題?我不知道我曾嘗試過這樣做,但這甚至有可能嗎?我不知道它爲什麼適用於std :: vector,但我的假設是它是錯誤的。您正在定義一個類,並在定義中使用該定義。似乎對我錯了。在這一個祝你好運,我會很有興趣看到一些更深層次的答案自己...

+0

它適用於std :: vector,並且在gcc上這個代碼也編譯得很好。我想只要sizeof(class)已知就足夠了。它顯然也絆住了我在評論中發佈的鏈接中的人們。我一直在用矢量做這個多年 - 只是一個巧合,它的工作,然後,我猜。 – Roel 2010-06-10 18:57:11

5

認爲問題是value_t是一個不完整的類型,直到達到定義的結束。試圖將不完整的類型用作標準容器的模板參數實際上並不適用。它在某些情況下可能會發生作用,但如果它在所有標準容器類型中都失敗了,仍然不會發出任何類型的錯誤。該標準要求它是一個完整的類型,所以如果不是,你會得到你所得到的 - 它可能應該一致失敗,但如果它碰巧工作,那沒有什麼錯。

相關問題