LINUX.ORG.RU

История изменений

Исправление bugfixer, (текущая версия) :

Если после декорирования (mangling) у этих двух методов окажутся одинаковые имена - то будет конфликт имён.

Символы запросто могут быть weak. Всё правильно написали - по сути дела visibility это полу-легальный (в смысле я не помню чтобы в стандарте хоть слово об этом было) способ обойти ODR. Я потому сразу и написал что на выхлоп препроцессора смотреть надо - там сразу было бы видно откуда символ пришёл, и с какими атрибутами.

UPD

всё оказалось хуже, декорированные имена методов совпадают и компоновщик выкинул второй foo() заменив его вызовом первого foo() для второго класса.

Вот он - «ODR в действии».

Исходная версия bugfixer, :

Если после декорирования (mangling) у этих двух методов окажутся одинаковые имена - то будет конфликт имён.

Символы запросто могут быть weak. Всё правильно написали - по сути дела visibility это полу-легальный (в смысле я не помню чтобы в стандарте хоть слово об этом было) способ обойти ODR. Я потому сразу и написал что на выхлоп препроцессора смотреть надо - там сразу было бы видно откуда символ пришёл, и с какими атрибутами.