2010-02-25 60 views
2

我有我的程序用C++編寫,它可以成功編譯在Ubuntu 9.04與g ++ 4.3.4和Solaris OS與g ++ 3.4.3。現在我已經將我的Ubuntu升級到版本9.10和g ++到版本4.4.1。現在編譯器調用STL中的錯誤。G ++ 4.4編譯錯誤,低版本工作

/usr/include/c++/4.4/bits/stl_deque.h: In member function ‘void std::deque<_Tp, _Alloc>::swap(std::deque<_Tp, _Alloc>&)’: 
In file included from /usr/include/c++/4.4/deque:65, 
/usr/include/c++/4.4/bits/stl_deque.h:1404: error: ‘swap’ is not a member of ‘std’ 
/usr/include/c++/4.4/bits/stl_deque.h:1405: error: ‘swap’ is not a member of ‘std’ 
/usr/include/c++/4.4/bits/stl_deque.h:1406: error: ‘swap’ is not a member of ‘std’ 
/usr/include/c++/4.4/bits/stl_deque.h:1407: error: ‘swap’ is not a member of ‘std’ 

我不知道如何解決它,如果可能的話,STL包含一個錯誤。你能幫我嗎?

非常感謝所有的建議。

+3

包含文件丟失。從這裏看起來它確實是std lib中的一個bug,但是也許你做錯了。你能把它提煉成幾行來重現錯誤並把它們寫入你的問題嗎? – sbi 2010-02-25 12:39:22

+1

剛剛測試過:'#include int main(){std :: deque d1,d2; d1.swap(D2); }在ubuntu 9.10中,g ++ 4.4.1編譯。你可以在編輯單元中顯示包含的內容嗎? – 2010-02-25 13:40:36

回答

7
#include <algorithm> 
+0

你是對的,非常感謝!你能解釋一下爲什麼我在使用隊列時必須包含算法嗎?爲什麼它不包含在默認值中? – Gaim 2010-02-25 16:27:17

+0

呵呵@ palm3D解釋它。還是非常感謝 – Gaim 2010-02-25 16:29:16

+0

IMO顯然是錯誤的。 (如果確實有必要,那麼std lib實現中就存在一個bug。)爲什麼這個問題得到了投票? – sbi 2010-02-27 10:46:01

0

在蘋果論壇發帖提出

#include <algorithm> 
+0

如果你想downvote請禮貌,以解釋爲什麼。如果這是因爲std :: deque文件應該包含它自己的算法,那麼我同意,但如果是這種情況,它不會使這個問題變得更少,特別是當完全相同的答案得到5票時。 – 2010-02-25 16:04:50

+0

...和相同的答案被接受! – 2010-02-25 16:27:11

+0

它可能已經被接受,但我也贊同它 - 並且出於完全相同的原因。我知道這對你不公平,但我對每個答案只有一個投票。這不是我是誰造成了不同...... – sbi 2010-02-26 16:27:40

2

在舊版本的GCC,如果你提供的任何標準庫頭,該頭通常會包括許多其他問題。正如別人所說,你的情況<algorithm>得到包括這種方式。

此行爲不是標準所要求的。標準庫的很多其他實現不會表現出這種行爲,或者程度較低。這只是GCC開發者很早以前做出的一項設計決定。看來他們現在正在減少這種行爲,使其更符合其他實現。這使您可以更好地控制包含的內容和不包含的內容。舊代碼會中斷,但通過包含缺少的標題可以很容易地解決這個問題。

+3

-1,_此行爲不是必需的_具有誤導性:STL頭應該是自包含的。如果包含''並使用'deque :: swap',並且該成員函數需要'std :: swap',那麼STL的實現者必須包含''。用戶代碼的標準中沒有要求在使用'deque :: swap'之前手動包含''。如果一個程序僅包含''並且使用'deque :: swap',那麼它就很好地組成了,所以編譯錯誤是編譯器/ stl的問題,而不是程序。雖然'不是必需的'列入,編譯代碼。 – 2010-02-25 13:23:26

+0

...我的意見也是誤導:在STL並不需要有''包括'',它需要允許只包括'所有程序'只有用',即使他們不deque'操作編譯包括''。其中一個選項是的std :: swap'移動'成被來自''幷包括不同的實現定義的頭''(以及哪些事項任何其他標準的頭,只需要'的std :: swap'沒有實際需要。所有的'' 2010-02-25 13:31:43

+0

你是對的,似乎他們已經在消除過分熱心「無償」包括:-) – palm3D 2010-02-25 13:44:16