1

我用 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()(class Test,class 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 : error LNK2005: "public: __thiscall KeyCompare::KeyCompare(void)" (??0?$KeyCompare@VTester@@@@QAE@XZ) 已在 MapTest.obj 中定义

MapTest.cpp 是我在其中编写测试用例的测试工具类。我也使用了包含守卫,以阻止多个包含。

知道怎么回事吗??

非常感谢你!!

4

2 回答 2

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)的工作方式。

于 2010-05-31T09:13:37.343 回答
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 引用传递。

于 2010-05-31T09:12:19.110 回答