Ошибка компиляции G ++ 4.4, более низкие версии работают - PullRequest
2 голосов
/ 25 февраля 2010

Моя программа написана на C ++, и ее можно успешно скомпилировать в Ubuntu 9.04 с g ++ 4.3.4 и ОС Solaris с g ++ 3.4.3. Теперь я обновил Ubuntu до версии 9.10 и g ++ до версии 4.4.1. Теперь компилятор вызывает ошибку в STL.

/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 ]

7 голосов
/ 25 февраля 2010
#include <algorithm>
2 голосов
/ 25 февраля 2010

В более старых версиях GCC, если вы включили какой-либо стандартный заголовок библиотеки, этот заголовок обычно включает много других. Как уже упоминалось, в вашем случае <algorithm> был включен таким образом.

Это поведение не требуется стандартом. Многие другие реализации стандартной библиотеки не демонстрируют такого поведения или в меньшей степени. Это было просто дизайнерское решение, принятое разработчиками GCC давно. Похоже, что теперь они уменьшают это поведение, приводя его в соответствие с другими реализациями. Это дает вам больше контроля над тем, что входит, а что нет. Старый код сломается, но его легко исправить, добавив отсутствующие заголовки.

0 голосов
/ 25 февраля 2010

Сообщение на форуме Apple предлагает

#include <algorithm>
...