Благодарю за то что нашли время на этот анализ.
Действительно довольно ожидаемая картина. Да, непонятно почему со свободными функциями компоновщик ругается, а с методами класса нет. Я уверен, что этому должно быть объяснение.
Я размещу вопрос на stackOverflow, скину ссылку сюда.
Евгений: Ну все-таки наверное не как попало. Определенный алгоритм работы у линковщика должен быть. Например, который описан здесь. То есть, например, он может обрабатывать obj файлы в определенной последовательности. Но вот почему он не ругается на это, как например со свободными функциями?
Nipheris: Да, неймспейсы это конечно. Это сразу говорит, что компоновка внутренняя (internal linkage). Тут без вопросов.
Но как быть если не обернул. Сам дурак?
Добавлю, что предварительно я задавал вопрос про компоновку имени класса здесь. И вроде как выяснили, что в примере выше она все-таки внешняя.
Да, действительно, Вы правы. Я только под отладчиком зашел в обе функции, убедился в том что вызываются нужные функции и на этом успокоился. Проверил на gcc и msvc поведение одинаково плохое. Интересно, как вообще трактуется такая ситуация? Код компилируется и компонуется без ошибок, однако работает непредсказуемо.
Собственно вопрос по внешней компоновке имени класса для меня теперь стал более-менее ясен. Как я понял смысл в том, что при компоновке приложения внешняя компоновка имени класса помогает линковщику "построить мост" между вызовом метода класса и его определением. Если имя класса имело бы внутреннюю компоновку, то и все его члены также имели бы внутреннюю компоновку.
Написано
Войдите на сайт
Чтобы задать вопрос и получить на него квалифицированный ответ.