2010-02-25 64 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