Повторяющиеся символы с реализацией только заголовка

У меня есть класс C ++, который объявлен и реализован в заголовочном файле. Я выбрал это, потому что нельзя легко перемещаться между сборками Debug и Release из-за _GLIBCXX_DEBUG и предварительно скомпилированные библиотеки. Например, если я определю _GLIBCXX_DEBUG, Boost завершится сбоем из-за изменений ABI в исходных файлах.

Реализация только заголовка создала проблему с дублирующимися символами. Например, в классе ниже operator== и не член swap будет производить несколько определенных символов.

// Foo.hpp
namespace Bar
{
template
class Foo
{
...
};

bool operator==(const Foo& a, const Foo& b) {
..
}
}

namespace std
{
template <>
void swap(Bar::Foo& a, Bar::Foo& b)
{
a.swap(b);
}
}

Когда объявление и реализация были разделены, файлы (Foo.hpp и Foo.cpp) скомпилированы и соединились.

Какой трюк, чтобы заставить это правильно скомпилировать и связать?

5

Решение

inline bool operator==(const Foo& a, const Foo& b) {
..
}

Функции-члены являются неявными встроенными, если они определены внутри своего класса. То же самое верно для них, правда: если они могут быть помещены в заголовок без хлопот, вы действительно можете это сделать.

Поскольку код функции помещается в заголовок и отображается, компилятор может встроить вызовы к ним, то есть поместить код функции непосредственно на сайт вызова (не столько потому, что вы поместили встроенный перед ним, но больше потому что компилятор решит этот путь, хотя. Помещение только inline — подсказка компилятору относительно этого). Это может привести к повышению производительности, поскольку компилятор теперь видит, где аргументы соответствуют переменным, локальным для функции, и где аргументы не совпадают друг с другом — и, наконец, что не менее важно, распределение фреймов функции больше не требуется.

6

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector