Студия игнорирует ODR?!
От: Basil2 Россия https://starostin.msk.ru
Дата: 13.03.13 09:53
Оценка: +1 -1
Использую Google Test. В нем определена функция

template <typename T>
void PrintTo(const T& value, ::std::ostream* os)
{ ... }

Чтобы распечатать свой тип, переопределяю ее:
inline void PrintTo(const MyType& value, ::std::ostream* os)
{ ... }

Итог:
Если gtest используется только в моем cpp-файле, все работает. Если gtest используется в нескольких файлах, то переопределение моей функции необходимо включить во все эти файлы! Если хотя бы в одном из этих файлов моя функция не определена, то она перестает вызываться (в моем cpp) и вместо нее используется шаблон.

Более того, даже если я убираю inline (и тогда использую функцию только в своем cpp-файле), все остается по-прежнему. Используется шаблон, а не моя свободная ф-ция. Какого х? Куда смотрит линкер?? Я так понимаю, по шаблону генерируются сигнатура, которая полностью совпадает с моей свободной функцией.

Два вопроса:
1. Почему это глотает линкер?
2. Как сделать так, чтобы гарантированно вызывалась моя функция? (не запихивая хидер с нею во все cpp-шники)
Проект Ребенок8020 — пошаговый гайд как сделать, вырастить и воспитать ребенка.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.