У меня есть код, который помещает набор TNotifyEvents в вектор.
std::vector<TNotifyEvent> m_availableCallbacks;
Это элемент главной формы приложения. В конструкторе форм он заполняется событиями.
m_availableCallbacks.push_back(ReadoutLastValue);
m_availableCallbacks.push_back(ReadoutCurrentDay);
m_availableCallbacks.push_back(ReadoutLastDay);
m_availableCallbacks.push_back(Readout7Days);
m_availableCallbacks.push_back(Readout1Month);
m_availableCallbacks.push_back(ReadoutChooseTimeSpan);
m_availableCallbacks.push_back(ReadoutAllData);
Затем этот вектор повторяется и используется для создания всплывающего меню и назначения событий уведомлений элементам в этом всплывающем меню.
Локальная компиляция не представляет проблемы. Когда я скомпилировал его на сервере сборки (под управлением TeamCity 6.5), я получил внутреннюю ошибку компилятора в строке, равной второму вызову push_back.
Я попытался отключить предварительно скомпилированные заголовки интеллектуального кэша локально в агенте сборки, отредактировав файлы cbproj. Это произвело успешную сборку. Поэтому я удалил директиву об использовании предварительно скомпилированных заголовков интеллектуального кэша из всех файлов cbproj и зафиксировал изменения. Я сказал TeamCity выполнить чистую проверку и снова получил ту же внутреннюю ошибку компилятора в том же месте. Странно то, что запуск новой компиляции после неудачной завершается успешно, так что это кажется чрезвычайно случайным.
Что происходит? Я привык передавать указатели функций (созданные мной самостоятельно) в других компиляторах C++. Нарушена ли внутренняя обработка TNotifyEvents или компилятор просто нестабилен и легко ломается?
Глядя на другой код, использующий TNotifyEvents, они не работают со ссылками или указателями, поэтому я не пробовал. И поскольку код (когда он компилируется) работает так, как задумано, это не проблема.
Обновление:
Я могу добавить, что журнал для TeamCity говорит, что файл FrontEnd.cpp (который содержит этот код) пропускается, когда я повторно запускаю компиляцию, и она завершается успешно.
[10:04:37]: [MakeObjs] CallTarget
[10:04:37]: [CallTarget] _CppDepCheck
[10:04:44]: [_CppDepCheck] MessageMap
[10:04:44]: [MessageMap] Skipping: ..., FrontEnd.cpp, ...
И даже для того, чтобы это работало, компиляция должна была завершиться успешно, когда произошла внутренняя ошибка компилятора. Как иначе он мог бы пропустить компиляцию файла и при этом волшебным образом появиться и использоваться в скомпилированной форме? :)
Обновление 2
После расследования я могу подтвердить, что это происходит ТОЛЬКО при компиляции в режиме выпуска. В релизе это происходит даже на моей локальной машине в IDE. Я пробовал возиться с такими настройками, как
- Отключить все оптимизации
- Создать самый быстрый код из возможных
- Файлы внешнего типа
- и так далее
очистка сборки между каждой попыткой. Но ДВС никуда не делся. Однако мне удалось заставить его жаловаться на другое место в другом файле. Возвращение к прежним настройкам НЕ приводит к возврату ошибки в файл FrontEnd.cpp. Этот компилятор кажется шатким :)
На самом деле я начал получать ICE по всему коду, и мне пришлось перезапустить IDE, чтобы вообще что-нибудь скомпилировать.
boost::function
в качестве параметра. Передачаboost::bind(&class:function, this)
вместо этого, казалось, исправила это для меня. уже... - person Roddy   schedule 15.01.2014