среда, 4 марта 2009 г.

Компиляторы бывают разные

И вновь продолжается бой :). Очередная мобильная платформа, новые спеки, новый компилятор и очередной порт STL.

Ничто не предвещало беды: ни убогая поддержка шаблонов (поубивал бы тех, кто отключает поддержу default parameters), ни время компиляции (15 минут - не предел, этот монстр еще и 1.5 гига ОЗУ кушает при этом), ни отсутствие документации (и правильно, закрытую платформу да без доки точно никто не осилит). Проблема нарисовалась при переносе старой самописной библиотечки шаблонных полезностей. Итак, имеем вот такую штуку (досталась в наследство со времен царя Гороха и кочевала по проектам чёрт знает сколько):

struct DeletePtr_t
{
public:
template
void operator()(const Ptr* const &toDel) const
{
delete toDel;
}

template
void operator()(Ptr* &toDel)
{
delete toDel;
toDel = NULL;
}
};

Такой "замысловатой" конструкции компилятор не осилил, как не осилил он и выдать хоть какую-нить информацию, в том числе где навернулся и почему. Разработчики компилятора решили просто: навернулись ну и хрен "Error 2" с ним, посему, крепко выругавшись задумавшись, методом половинного деления и было найдено место преступления.
Код был проверен набором онлайн-компиляторов и скомпилился без проблем. Проблемы у существующего компилятора возникаю здесь:

void operator()(const Ptr* const &toDel) const

при этом следующие варианты работают без проблем

void operator()(Ptr* const &toDel) const
void operator()(const int* const &toDel) const

В общем, кто любит решать подобные головоломки (а может кто уже решил?) - милости прошу в комментарии. В любом случае, во имя великого дедлайна я должен разобраться с этим не позднее обеда и да прибудут со мной системные ресурсы :).

П.С. Как бы прикрутить подсветку и форматирование кода? Очень неудобно...

2 комментария:

  1. А нафига вообще нужен такой шаблонный класс?

    Лично я не могу себе представить вменяемого кода где он мог бы использоваться.

    А зарезолвить ошибку скорее всего можно через тайпдефы

    ОтветитьУдалить
  2. vector< CSomePtr* > vPointers;

    for_each( m_vPointers.begin(), m_vPointers.end(), DeletePtr() ); Вменяемо? :)

    Про резолв ошибки - можно поподробнее?

    ОтветитьУдалить