Ошибка ссылки для определяемого пользователем типа класса обрабатывает параметр по шаблону

Я реализовал Простую карту 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 является классом тестовой обвязки, в котором я записал тестовый сценарий. Я использовал, включают защиту также, для остановки нескольких включений.

Какая-либо идея, каков вопрос??

Большое спасибо!!

1
задан Preet Sangha 31 May 2010 в 09:09
поделиться

2 ответа

Это не специализация.

Также покажите, пожалуйста, весь код. Похоже, вы использовали шаблон метода 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).

2
ответ дан 3 September 2019 в 00:12
поделиться

Вам не нужна специализация - просто перегрузите ее:

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 ссылки.

0
ответ дан 3 September 2019 в 00:12
поделиться
Другие вопросы по тегам:

Похожие вопросы: