错误:对二进制表达式无效的操作数(映射使用查找功能错误)

时间:2019-06-06 06:18:49

标签: c++

#include <iostream>
#include <map>
#include <utility>
using namespace std;
class __ME
{
public:
    int age;
    __ME()
    {
    }
    __ME(int a)
    {
        age = a;
    }
    void Run()
    {
        if (age)
        {
            cout << "age" << age << endl;
        }
        else
        {
            cout << "run..." << endl;
        }
    }
};

template <class K, class V>
class value_equals
{
private:
    K key;

public:
    value_equals(const K &vt) : key(vt)
    {
    }
    bool operator==(pair<const K, V> &elem)
    {
        return elem->first == key;
    }
};

int main()
{
    map<string, __ME *> *me1 = new map<string, __ME *>();
    me1->insert(map<string, __ME *>::value_type("lyl", new __ME()));
    me1->insert(map<string, __ME *>::value_type("lx1", new __ME()));
    map<string, __ME *>::iterator it = find(me1->begin(), me1->end(), value_equals<string, __ME *>("lyl"));
    cout << it->first << endl;
}
error: invalid operands to binary expression
      ('std::__1::__map_iterator<std::__1::__tree_iterator<std::__1::__value_type<std::__1::basic_string<char>, __ME *>, std::__1::__tree_node<std::__1::__value_type<std::__1::basic_string<char>, __ME *>, void *> *,
      long> >::value_type' (aka 'pair<const std::__1::basic_string<char>, __ME *>') and 'const value_equals<std::__1::basic_string<char>, __ME *>')
        if (*__first == __value_)
            ~~~~~~~~ ^  ~~~~~~~~

我不知道我在这段代码中做错了什么。 我希望你能给我一个建议。

1 个答案:

答案 0 :(得分:0)

要使代码正常工作,您需要稍微修改操作符定义:

template <class K, class V>
class value_equals
{
private:
    K key;

public:
    value_equals(const K &vt) : key(vt)
    {
    }
    bool operator==(const pair<const K, V> &elem) const
    {
        return elem.first == key;
    }
};

template <class K, class V>
bool operator==(const pair<const K, V> &lhs, const value_equals<K,V>& rhs)
{
    return rhs == lhs;    
}

std::find试图做element == value,而您的实现只提供了value == element。您还需要确保将const放在所有正确的位置。

如果您使用std::find_if,这将变得更加简单:

template <class K, class V>
class value_equals
{
private:
    K key;

public:
    value_equals(const K &vt) : key(vt)
    {
    }
    bool operator()(const pair<const K, V> &elem) const
    {
        return elem.first == key;
    }
};

map<string, __ME *>::iterator it = find_if(me1->begin(), me1->end(), value_equals<string, __ME *>("lyl"));

最简单(也是最有效)的方法是使用std::map的内置查找支持:

map<string, __ME *>::iterator it = me1->find("lyl");

请注意,如果未找到元素,则cout << it->first << endl如果不检查it != me1->end(),将导致未定义的行为。

请注意,__ME是保留的标识符,不应在您的代码中使用。保留给编译器/标准库使用的任何以__开头的标识符或以单个_开头且后跟大写字母的标识符。