模板类中的关系运算符重载 (C++)

发布于 2024-10-18 08:32:04 字数 1248 浏览 4 评论 0原文

我正在创建一个 KeyValuePair 类,并且在重载关系运算符时遇到一些麻烦。据我了解,这是使用 std 排序函数所必需的(我试图根据值进行排序)

这是标题:

template <typename K, typename V>
class KeyValuePair
{
public:
    //factory
    static KeyValuePair<K,V>* newKeyValuePair(K key, V value);  
    //getters
    const K &Key() const;
    const V &Value() const;
    //setter
    V &Value();

    //The problem
    bool operator<(const KeyValuePair<K,V> &rhs);

    string toString();
    ~KeyValuePair(void);
private:
    K key;
    V value;
    KeyValuePair(K key, V value);
    KeyValuePair(void);
};

这是 << 的定义。 。

template <typename K, typename V>
bool KeyValuePair<K,V>::operator<(const KeyValuePair<K,V> &rhs)
{
    return value < rhs.Value();
}

这是我正在测试该类功能的主要部分

int _tmain(int argc, _TCHAR* argv[])
{
    KeyValuePair<char,int>* kvp1 = KeyValuePair<char, int>::newKeyValuePair('A',1);
    KeyValuePair<char,int>* kvp2 = KeyValuePair<char,int>::newKeyValuePair('B',10);
    cout << (kvp1 < kvp2) << "\n";
    return 0;
}

我在 < 处有一个断点我的 KeyValuePair 类中的函数,并且它从未被激活。

有什么想法吗?提前致谢。

I am creating a KeyValuePair class, and am running into some trouble when overloading the relational operators. It is my understanding that this is necessary for using the std sort functions (I am trying to have sort based on the values)

Here is the header:

template <typename K, typename V>
class KeyValuePair
{
public:
    //factory
    static KeyValuePair<K,V>* newKeyValuePair(K key, V value);  
    //getters
    const K &Key() const;
    const V &Value() const;
    //setter
    V &Value();

    //The problem
    bool operator<(const KeyValuePair<K,V> &rhs);

    string toString();
    ~KeyValuePair(void);
private:
    K key;
    V value;
    KeyValuePair(K key, V value);
    KeyValuePair(void);
};

Here is the definition of the < function

template <typename K, typename V>
bool KeyValuePair<K,V>::operator<(const KeyValuePair<K,V> &rhs)
{
    return value < rhs.Value();
}

And here is the main where I am just testing the functionality of the class.

int _tmain(int argc, _TCHAR* argv[])
{
    KeyValuePair<char,int>* kvp1 = KeyValuePair<char, int>::newKeyValuePair('A',1);
    KeyValuePair<char,int>* kvp2 = KeyValuePair<char,int>::newKeyValuePair('B',10);
    cout << (kvp1 < kvp2) << "\n";
    return 0;
}

I have a breakpoint at the < function in my KeyValuePair class, and it is never activated.

Any Ideas? Thanks in advance.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

梦与时光遇 2024-10-25 08:32:04

kvp1kvp2 是指向 KeyValuePair 对象的指针。它们本身不是 KeyValuePair 对象。

<代码>*kvp1 < *kvp2 将调用重载的运算符<。您不能重载两种指针类型的operator<,因为将使用指针的内置operator<

std::pair 可以用作键值对。无论如何,您几乎肯定不应该动态创建这种类型的对象:您应该尽可能避免动态分配,尤其是显式动态分配。相反,只需使用 KeyValuePair 局部变量:

KeyValuePair<char, int> kvp1('A', 1);
KeyValuePair<char, int> kvp2('B', 10);
std::cout << (kvp1 < kvp2) << "\n"; // calls your operator< overload

kvp1 and kvp2 are pointers to KeyValuePair<char, int> objects. They are not themselves KeyValuePair<char, int> objects.

*kvp1 < *kvp2 would invoke your overloaded operator<. You cannot overload operator< for two pointer types because the built-in operator< for pointers will be used.

std::pair can be used as a key-value pair. In any case, you almost certainly shouldn't be dynamically creating objects of this type: you should prefer to avoid dynamic allocation wherever possible, especially explicit dynamic allocation. Instead, just use KeyValuePair<char, int> local variables:

KeyValuePair<char, int> kvp1('A', 1);
KeyValuePair<char, int> kvp2('B', 10);
std::cout << (kvp1 < kvp2) << "\n"; // calls your operator< overload
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文