Внутренняя ошибка компилятора gcc 3.4 с std::map.find

кто-нибудь сталкивался со следующей ошибкой с gcc 3.4, boost 1.34.1. Конфликтующий код выглядит следующим образом:

class Symbol
{
/// ...
bool operator<( const Symbol& rhs ) const;
};
typedef boost::function< double( const XYZ::Date& ) > F;
typedef std::map<Symbol, F> M;

M aMap; // properly instantiated
Symbol s; // properly instantied

M::const_iterator it = aMap.find( s ); // dies in this call, see below

Symbol.h:97 ссылается на константную функцию-член логического оператора‹( const Symbol& ), которая сравнивает два экземпляра типа Symbol. Это отлично работает на всех компиляторах, кроме gcc 3.4, где это вызывает следующую внутреннюю ошибку компилятора.

/XYZ/include/XYZ/AAA/Type/Symbol.h:97: внутренняя ошибка компилятора: в gen_subprogram_die, в dwarf2out.c:11278

Я пытался найти какой-либо указатель на причину, по которой вышеизложенное не работает в Интернете, но не смог найти никакого решения. Кто-нибудь сталкивался с этим с помощью каких-либо изменений? Или кто-нибудь подскажет, почему компилятор gcc умирает в этот момент?

Спасибо за любую помощь.

/XYZ/AAA/Type/Symbol.h: In member function `bool XYZ::Symbol::operator<(const XYZ::Symbol&) const':
/XYZ/AAA/Type/Symbol.h:97:   
instantiated from `bool std::less<_Tp>::operator()(const _Tp&, const _Tp&) const [with _Tp = XYZ::Symbol]'
/usr/local/include/c++/3.4.5/bits/stl_tree.h:1125:   
instantiated from 

`typename std::_Rb_tree<_Key, _Val, _KeyOfValue, _Compare, _Alloc>::const_iterator std::_Rb_tree<_Key, _Val, _KeyOfValue, _Compare, _Alloc>::find(const _Key&) const 
[with 
_Key = XYZ::Symbol, 
_Val = std::pair<const XYZ::Symbol, boost::function<double ()(const XYZ::Date&), std::allocator<void> > >, 
_KeyOfValue = std::_Select1st<std::pair<const XYZ::Symbol, boost::function<double ()(const XYZ::Date&), std::allocator<void> > > >, 
_Compare = std::less<XYZ::Symbol>, 
_Alloc = std::allocator<std::pair<const XYZ::Symbol, boost::function<double ()(const XYZ::Date&), std::allocator<void> > > >
]'

/usr/local/include/c++/3.4.5/bits/stl_map.h:513:  

instantiated from 

`typename std::_Rb_tree<_Key, std::pair<const I, T>, std::_Select1st<std::pair<const I, T> >, _Compare, _Alloc>::const_iterator std::map<_Key, _Tp, _Compare, _Alloc>::find(const _Key&) const 

[with 
_Key = XYZ::Symbol, 
_Tp = boost::function<double ()(const XYZ::Date&), std::allocator<void> >, 
_Compare = std::less<XYZ::Symbol>, 
_Alloc = std::allocator<std::pair<const XYZ::Symbol, boost::function<double ()(const XYZ::Date&), std::allocator<void> > > >
]'

AFunc.cpp:70:   instantiated from here
/XYZ/include/XYZ/AAA/Type/Symbol.h:97: internal compiler error: in gen_subprogram_die, at dwarf2out.c:11278

person user1357687    schedule 26.04.2012    source источник
comment
gcc 3.4.5 был выпущен в 2005 году (более 7 лет назад), почему вы не обновились?   -  person Jesse Good    schedule 26.04.2012
comment
@JesseGood: возможно, потому что ОП не тот, кто решает ...   -  person Matthieu M.    schedule 26.04.2012


Ответы (1)


Попробуйте один из них:

  1. обновите свой gcc :)
  2. попробуйте разные флаги компилятора.
  3. попробуйте сделать копию этого заголовочного файла и попытаться сократить объявление класса Symbol до тех пор, пока ошибка не прекратится, а затем возьмите его оттуда. Посмотрите, сможете ли вы обойтись без декларации на платформе, на которой вы компилируете.
  4. Если ваша цель — получить бинарные файлы для определенного дистрибутива, попробуйте создать установку этого дистрибутива на виртуальной машине (если вы все еще можете ее получить!), обновить ее gcc и скомпилировать с ее помощью.

Я рекомендую вариант 1. Последнее официальное обновление gcc3, которое я смог найти, это 3.4.6 в марте 2006 года. В ближайшее время оно не будет исправлено.

person Michael Slade    schedule 26.04.2012