2010-02-25 3 views
2

내 프로그램이 C++로 작성되었으며 g ++ 4.3.4를 사용하는 우분투 9.04 및 g ++ 3.4.3을 사용하는 Solaris OS에서 성공적으로 컴파일 할 수 있습니다. 이제 우분투를 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’ 

버그 수정 방법 및 버그가있을 수 있습니다. 도와 줄수있으세요?

모든 조언에 대해 감사드립니다. 당신이 어떤 표준 라이브러리 헤더를 포함하면

+3

포함 파일이 없습니다. 여기에서 보면 std lib에 실제로 버그가있는 것처럼 보입니다. 그러나 어쩌면 여러분은 잘못된 것을했을 수도 있습니다. 오류를 재현하여 질문에 넣을 수있는 몇 줄로 바꿀 수 있습니까? – sbi

+1

그냥 테스트 :'#include int main() {std :: deque d1, d2; d1.swap (d2); }'우분투 9.10, g ++ 4.4.1에서 컴파일됩니다. 컴파일 유닛에 포함 된 것을 보여줄 수 있습니까? –

답변

7
#include <algorithm> 
+0

네가 맞아, 고마워! 큐를 사용할 때 알고리즘을 포함해야하는 이유를 설명해 주시겠습니까? 왜 그것이 기본에 포함되어 있지 않습니까? – Gaim

+0

오 @ palm3D가 설명했습니다. 아직도 많이 고마워. – Gaim

+0

IMO가 틀렸어. (실제로 필요한 경우에는 std lib 구현에 버그가 있습니다.) 왜 이것이 최대 투표를 받습니까? – sbi

0

애플 포럼에 게시물, GCC의 이전 버전에서

#include <algorithm> 
+0

당신이 downvote하려고한다면 이유를 설명하기 위해 정중하게하시기 바랍니다. 그것이 std :: deque 파일에 알고리즘을 포함해야하기 때문에 그렇다면 동의합니다.하지만 똑같은 경우 수정 사항을 적게 만들지는 않습니다. 특히 똑같은 대답이 5 장을받습니다. –

+0

... 같은 대답이 받아 들여졌습니다! –

+0

그것은 받아 들여 졌을 지 모르지만, 나는 똑같은 이유에서 - 똑같은 이유에서 - 반대표를 던졌다. 나는 그것이 당신에게 공평하지 않다는 것을 알고 있지만, 나는 각 대답에 대해서 단 하나의 표를 가진다. 차이점을 만든 사람이 아니 었습니다. – sbi

2

을 제안, 그 헤더는 많은 사람들을 일반적으로 포함됩니다. 다른 사람들이 언급했듯이, 귀하의 경우에는 <algorithm>이 포함됩니다.

이 동작은 표준에서 요구되지 않습니다. 표준 라이브러리의 많은 다른 구현은이 동작을 나타내지 않거나 더 적게 나타납니다. 오래 전 GCC 개발자들이 만든 디자인 결정이었습니다. 그들은 이제이 동작을 줄이고 다른 구현과 함께 더 많은 것을 가져 오는 것 같습니다. 이렇게하면 포함될 내용과 포함되지 않는 내용을보다 효과적으로 제어 할 수 있습니다. 이전 코드는 중단되지만 누락 된 헤더를 포함하면 쉽게 수정할 수 있습니다.

+3

-1, _이 동작은 필수적이지 않습니다. 오해의 소지가 있습니다. STL 헤더는 자체 포함되어야합니다. ''을 포함하고'deque :: swap'을 사용하고 그 멤버 함수가'std :: swap'을 요구한다면, STL의 구현자는''을 포함해야합니다. 'deque :: swap'을 사용하기 전에 수동으로 ''을 포함시킬 사용자 코드 표준의 요구 사항은 없습니다. 프로그램에''만 있고'deque :: swap '을 사용하면 잘 형성되어 컴파일러/stl에서는 컴파일 오류가 발생하고 프로그램에서는 문제가되지 않습니다.''을 포함 할 필요는 없지만 코드를 컴파일하면됩니다. –

+0

... 내 의견도 오해 할 소지가 있습니다 : STL은 ''을 포함 할 필요가 없습니다.' '을 포함하면,' '만 포함하는 모든 프로그램을 허용하고 그렇지 않은 경우에도'deque' 연산 컴파일 만 사용하면됩니다. ''을 포함하십시오. 하나의 옵션은'std :: swap '을' '과' '(그리고 실제로 요구하지 않고'std :: swap' 만 필요로하는 다른 표준 헤더와 관련이있는)에서 모두 가져 오는 다른 구현 정의 헤더로 옮기는 것입니다 모두 '' –

+0

당신이 맞습니다. "gratuitous"를 제거하는 데 열중하고있는 것 같습니다 :-) – palm3D