Я реализовал Простую карту STL в C++. Факторизованный сравнение, поскольку тип, поскольку я был проинструктирован к, затем реализовал сравнение как показано ниже:
template <typename T> int KeyCompare<T>::operator () (T tKey1, T tKey2)
{
if(tKey1 < tKey2)
return -1;
else if(tKey1 > tKey2)
return 1;
else
return 0;
}
здесь, tKey1 и tKet2 являются этими двумя ключами, которые я сравниваю. Это работало хорошо на все типы основных данных и строку. Я добавил шаблонную специализацию для сравнения ключей определяемого пользователем типа под названием Тест и добавил специализацию следующим образом:
int KeyCompare<Test>::operator () (Test tKey1, Test tKey2)
{
if(tKey1.a < tKey2.a)
return -1;
else if(tKey1.a > tKey2.a)
return 1;
else
return 0;
}
когда я выполняю это, я получаю связывающуюся ошибку при высказывании
SimpleMap.obj: ошибка LNK2005: "общественность: интервал __ thiscall KeyCompare:: оператор () (класс Тест, класс Тест)" (?? R? $KeyCompare@VTest @@@@ QAEHVTest @@ 0@Z) уже определенный в MapTest.obj
SimpleMap.obj: ошибка LNK2005: "общественность: __ thiscall KeyCompare:: ~KeyCompare (пусто)" (?? 1? $KeyCompare@VTest @@@@ QAE@XZ) уже определенный в MapTest.obj
SimpleMap.obj: ошибка LNK2005: "общественность: __ thiscall KeyCompare:: KeyCompare (пусто)" (?? 0? $KeyCompare@VTester @@@@ QAE@XZ) уже определенный в MapTest.obj
MapTest.cpp является классом тестовой обвязки, в котором я записал тестовый сценарий. Я использовал, включают защиту также, для остановки нескольких включений.
Какая-либо идея, каков вопрос??
Большое спасибо!!
Это не специализация.
Также покажите, пожалуйста, весь код. Похоже, вы использовали шаблон метода operator ()
. Это довольно необычно. Вместо этого создайте шаблон для всего класса и правильно его специализуйте.
Поэтому вместо вашего кода напишите что-то вроде этого:
template <typename T>
struct KeyCompare {
int operator ()(T const& key1, T const& key2) const {
// Comparison logic here …
}
};
А затем специализируйте класс:
template <>
struct KeyCompare<Test> {
int operator()(Test const& key1, Test const& key2) const { … }
};
Это немного больше кода, но делает его действительно расширяемым (поскольку каждый может добавить свою собственную реализацию специализации без необходимости изменять существующие код). Таким же образом работают и другие библиотеки C ++ (в частности, STL).
Вам не нужна специализация - просто перегрузите ее:
int KeyCompare::operator () (Test tKey1, Test tKey2)
{
if(tKey1.a < tKey2.a)
return -1;
else if(tKey1.a > tKey2.a)
return 1;
else
return 0;
}
И вы должны передавать параметры t всех этих функций сравнения как const ссылки.