unordered_set с пользовательским предикатом делает ошибку компоновщика (дублированный символ)

я застрял с небольшой проблемой: у меня есть unordered_set, который содержит структуру. Я уже реализовал хэш-функцию. Но когда я впервые скомпилировал свою программу, я получил ошибку компилятора, говорящую о том, что я не реализовал перегруженный оператор «==».

Проблема в том, что когда я объявляю мой перегруженный:

bool operator==(mapPoint const& p1, mapPoint const& p2){
return p1.x == p2.x && p1.y == p2.y;
}

У меня ошибка компоновщика. В каждом файле, в который включен заголовок, я получаю сообщение об ошибке (дублирующий символ __XXXX_mapPointS1_).

Дело в том, что он отлично работает, когда помещается в файл реализации, где я использую его с unordered_set.

Мой вопрос, как я могу решить эту проблему? За компилятором столько магии, чем я не могу понять. мотки

0

Решение

Вы понимаете, что у вас нет этой проблемы, когда вы помещаете это в файл реализации.

Компилятор C ++ не имеет никакого представления о заголовках и файлах реализации. Он просто знает о «единицах перевода», файлах cpp. Заголовочные файлы включены препроцессором C. Компилятор видит только один файл.
Если вы определяете функцию в заголовке, который включен в несколько файлов cpp, и эта функция имеет внешнюю связь, то компоновщик будет жаловаться на дубликаты определений.

Как правило, вы должны хранить только определения заголовков для встроенных функций.

Если вы все еще хотите это сделать, вам следует избегать внешних связей: либо объявив функцию встроенной, либо объявив ее статической, либо объявив ее внутри пространства имен без имени (что является способом определения содержимого в C ++ для перевода внутри себя) единица измерения).

namespace // local
{
bool operator==(mapPoint const& p1, mapPoint const& p2)
{ return p1.x == p2.x && p1.y == p2.y; }
}

или немного некрасиво и недоумение

static bool operator==(mapPoint const& p1, mapPoint const& p2)
{ return p1.x == p2.x && p1.y == p2.y; }

или, потому что эта функция выглядит хорошим кандидатом для встраивания:

inline bool operator==(mapPoint const& p1, mapPoint const& p2)
{ return p1.x == p2.x && p1.y == p2.y; }
1

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

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

По вопросам рекламы [email protected]