用户定义的类类型模板参数的链接错误

时间:2010-05-31 09:07:44

标签: visual-c++ templates linker-errors template-specialization

我在C ++中实现了一个简单的STL映射。根据我的指示将比较考虑在内,然后实施比较,如下所示:

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,class Test)”(?? R?$ KeyCompare @ VTest @@@@ QAEHVTest @@ 0 @ Z)已经在MapTest.obj中定义

SimpleMap.obj:错误LNK2005:已在MapTest.obj中定义的“public:__ thiscall KeyCompare :: ~KeyCompare(void)”(?? 1?$ KeyCompare @ VTest @@@@ QAE @ XZ)

SimpleMap.obj:错误LNK2005:已在MapTest.obj中定义的“public:__ thiscall KeyCompare :: KeyCompare(void)”(?? 0?$ KeyCompare @ VTester @@@@ QAE @ XZ)

MapTest.cpp是我在其中编写测试用例的测试工具类。我也使用了包括警卫来阻止多重包含。

知道问题是什么?

非常感谢!!

2 个答案:

答案 0 :(得分: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)工作的方式。

答案 1 :(得分:0)

您不需要专业化 - 只需将其重载:

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;
}

并且您应该将所有这些比较函数的参数作为const引用传递。