Шаблоны и fatal error C1063 (compiler stack overflow)
От: vselin Россия  
Дата: 23.11.03 17:57
Оценка:
Я использую VS 6 sp5.
В связи с чем может возникать такая ошибка?

У меня указанная ошибка C1063 возникает при попытке компилировать код использующий мой шаблоный класс map_p.

Этот шаблон был создан для реализации ассоциативного списока следующего вида:
пара значений типов Ty1 и Ty2 ассоциируется со значением типа Ty3

При этом:
  1. Первое значение из пары уникальный ключ.
  2. Второе значение из пары создает подмножества значений (и соответственно не уникально). Будем называть его родитель.

От класса требуется следующее:
  1. Возможность найти значение по ключу.
  2. Возможность найти родителя по ключу.
  3. Возможность перебирать значения от первого до последнего.
  4. Возможность перебирать значения с заданным родителем от первого до последнего.
  5. Возможность вставлять и удалять значения, разумеется.
  6. Список сортированный и порядок значений в списке задается в первую очередь предикатом Pr2 определяющим порядок значений типа Ty2, во вторую очередь предикатом Pr3 определяющим порядок значений типа Ty3 и в последнюю очередь предикатом Pr1 определяющим порядок значений типа Ty1.

Я реализовал свой шаблон на базе шаблонов STL map и set

template<class Ty1, class Ty2, class Ty3, class Pr3 = less<Ty3>, class Pr1 = less<Ty1>, class Pr2 = less<Ty2> >
class map_p
{
//...
    typedef tern< Ty1, Ty2, Ty3 > value_type;
    typedef tern_compare< Ty1, Ty2, Ty3, Pr1, Pr2, Pr3 > value_compare;
    typedef set< value_type, value_compare >::iterator iterator;    
protected:
    set< value_type, value_compare > values;
    map< Ty1, iterator, Pr1 > keys;
    map< Ty2, pair< iterator, iterator >, Pr2 > parents;
//...
}


здесь в values хранятся тройки ключ, родитель, значение
keys связывает ключ и итератор указывающий на соответствующую тройку в values
parents связывает родителя и пару итераторов указывающих на первую и последнюю тройку с соответствующим значением родителя в values

на небольших тестовых примерах шаблон работает, правда постоянно выдаеются предупреждения C4786 о том, что identifier was truncated to '255' characters in the browser information

В реальной задаче компиляция приводит к ошибке C1063.

Я предполагаю, что проблема связана с длинной получающихся идентификаторов в первую очередь итератора, в связи с чем возникает два вопроса:

  1. Можно ли как-то обойти проблему не меняя реализации шаблона?
  2. Если менять реализацию всё-таки придется, то каким образом лучше это сделать, что бы ещё раз не наступить на те же грабли?

Если есть необходимость я могу привести полный код реализации данного шаблона.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.