我在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是我在其中编写测试用例的测试工具类。我也使用了包括警卫来阻止多重包含。
知道问题是什么?
非常感谢!!
答案 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引用传递。