Шаблоны и 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. Если менять реализацию всё-таки придется, то каким образом лучше это сделать, что бы ещё раз не наступить на те же грабли?

Если есть необходимость я могу привести полный код реализации данного шаблона.
Re: Шаблоны и fatal error C1063 (compiler stack overflow)
От: Павел Кузнецов  
Дата: 24.11.03 14:49
Оценка:
Здравствуйте, vselin, Вы писали:

v> Я использую VS 6 sp5.

v> В связи с чем может возникать такая ошибка?

Например, в связи с бесконечной рекурсией при инстанциировании шаблона.

v> на небольших тестовых примерах шаблон работает, правда постоянно выдаеются

v> предупреждения C4786 о том, что identifier was truncated to '255' characters <...>
v> Я предполагаю, что проблема связана с длинной получающихся идентификаторов

Очень маловероятно.

v> Если есть необходимость я могу привести полный код реализации данного шаблона.


Есть необходимость посмотреть минимальный код. Т.е. обрезай свой шаблон и код,
его использующий пока он не станет достаточно маленьким, но так, чтобы проблема
все еще воспроизводилась.
Posted via RSDN NNTP Server 1.7 "Bedlam"
Легче одурачить людей, чем убедить их в том, что они одурачены. — Марк Твен
Re[2]: Шаблоны и fatal error C1063 (compiler stack overflow)
От: Richard Redford Россия  
Дата: 24.11.03 19:32
Оценка:
Здравствуйте, Павел Кузнецов, Вы писали:

v>> В связи с чем может возникать такая ошибка?

ПК>Например, в связи с бесконечной рекурсией при инстанциировании шаблона.
Собственно это единственное, что и мне пришло в голову.
Наличие отсутствия такой ошибки я проверил до того как обращаться к общественности.

Я уже совсем было отчаялся что-либо понять в происходящем, но совершенно случайно обнаружил, что эта ошибка исчезает стоит только отключить в Project settings -> C/C++ -> General опцию "generate browse info" которой соответствует ключик /FR

В общем, проблема не то что бы решена, но найдены пути её устранения. Спасибо всем, кто откликнулся.

Конечно, если кто-нибудь сможет объяснить причину возникновения такой ошибки и как она связана с browse info буду весьма рад услышать это объяснение.

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

Паралельно ещё вопрос:
я не смог найти толкового описания конструкции #pragma warning
Во всяком случае то, что я по этому поводу прочитал в MSDN не дает объяснения, почему строчка
#pragma warning (disable: 4786)

ничерта не отключает это самое предупреждение C4786 коих компилятор мне выдает более 300 штук. Что довольно неудобно.
А отключить вывод этого предупреждения мне удается только отключив вывод всех предупреждений. Что в общем-то тоже не есть хорошо.

Может кто-нибудь знает какие-нибудь тонкости с отключением выборочных предупреждений в VC6?
Re[3]: Шаблоны и fatal error C1063 (compiler stack overflow)
От: Аноним  
Дата: 24.11.03 20:00
Оценка:
Здравствуйте, Richard Redford, Вы писали:

RR>Паралельно ещё вопрос:

RR>я не смог найти толкового описания конструкции #pragma warning
RR>Во всяком случае то, что я по этому поводу прочитал в MSDN не дает объяснения, почему строчка
RR>
RR>#pragma warning (disable: 4786)
RR>

RR>ничерта не отключает это самое предупреждение C4786 коих компилятор мне выдает более 300 штук. Что довольно неудобно.
RR>А отключить вывод этого предупреждения мне удается только отключив вывод всех предупреждений. Что в общем-то тоже не есть хорошо.

RR>Может кто-нибудь знает какие-нибудь тонкости с отключением выборочных предупреждений в VC6?

Попытайтесь поставить указанную pragma до первых строчек кода translation unit. Наример, до всех #include директив в cpp файле.

--
Михаил Кочетков.
Re[4]: Шаблоны и fatal error C1063 (compiler stack overflow)
От: Richard Redford Россия  
Дата: 24.11.03 20:11
Оценка:
Здравствуйте, Аноним, Вы писали:
А>Попытайтесь поставить указанную pragma до первых строчек кода translation unit. Наример, до всех #include директив в cpp файле.
Собственно так и стоит.
Сразу после #pragma once
Re[5]: Шаблоны и fatal error C1063 (compiler stack overflow)
От: Аноним  
Дата: 24.11.03 20:23
Оценка:
Здравствуйте, Richard Redford, Вы писали:

RR>Здравствуйте, Аноним, Вы писали:

А>>Попытайтесь поставить указанную pragma до первых строчек кода translation unit. Наример, до всех #include директив в cpp файле.
RR>Собственно так и стоит.
RR>Сразу после #pragma once
Боюсь, что Вы совершенно невнимательно читали. #pragma once, насколько я понимаю, ставится в заголовочных файлах, а я говорил о единице компиляции -- translation unit. Чтобы гарантировать, что запрещающая предупреждения pragma стоит до первых строчек кода, Вам необходимо поместить ее именно в исходном, cpp файле. Иначе Вам придется внимательно следить, что Ваш заголовочный файл с этой pragma всегда включается первым.

--
Михаил Кочетков.
Re[6]: Шаблоны и fatal error C1063 (compiler stack overflow)
От: Richard Redford Россия  
Дата: 25.11.03 04:14
Оценка:
Здравствуйте, Аноним, Вы писали:

А>... Иначе Вам придется внимательно следить, что Ваш заголовочный файл с этой pragma всегда включается первым.


Действительно, был невнимателен. Спасибо.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.