Ошибка связи для пользовательского параметра шаблона типа класса - PullRequest
1 голос
/ 31 мая 2010

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

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: «public: int __thiscall KeyCompare :: operator () (класс Test, класс Test)» (?? R? $ KeyCompare @ VTest @@@@ QAEHVTest @@ 0 @ Z) уже определено в MapTest.obj

SimpleMap.obj: ошибка LNK2005: «public: __thiscall KeyCompare :: ~ KeyCompare (void)» (?? 1? $ KeyCompare @ VTest @@@@ QAE @ XZ) уже определено в MapTest.obj

SimpleMap.obj: ошибка LNK2005: «public: __thiscall KeyCompare :: KeyCompare (void)» (?? 0? $ KeyCompare @ VTester @@@@ QAE @ XZ) уже определено в MapTest.obj

MapTest.cpp - это класс тестового набора, в котором я написал тестовый пример. Я также использовал include guard, чтобы остановить несколько включений.

Есть идеи, в чем дело ??

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

Ответы [ 2 ]

2 голосов
/ 31 мая 2010

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

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

0 голосов
/ 31 мая 2010

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

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 всем этим функциям сравнения в виде константных ссылок.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...