У нас есть большая база кода на C ++, и после небольшого рефакторинга (добавлен один класс и переписаны некоторые связанные методы) мы начали получать ошибки компоновщика в GCC 3 и 4. Ошибками компоновщика были, в частности, «отсутствующие ссылки на не виртуальные преобразователи» в небольшие примеры программ, которые делят классы на подклассы в нашем большом SDK.
Поиск в Интернете не дал особых подсказок, кроме некоторых старых ошибок GCC, которые, похоже, были решены.
Признаки проблемы кажутся такими:
- Оптимизация GCC 3.4.6 и 4.3.3 с
-O2
- Множественное наследование, включая случайное виртуальное наследование.
- Изменение порядка наследования, скажем, с
class Foo: public A, public B {}
наclass Foo: public B, public A {}
для классов, в которых отсутствуют преобразователи, «решает» проблему.
Виртуальное наследование появляется только в одном, очень часто используемом базовом классе для подсчета ссылок. Я убедился, что каждое использование этого класса действительно является виртуальным публичным, а не просто случайным публичным наследованием.
Очевидно, что изменение порядка наследования на самом деле не решает проблему. Что еще это может быть?