【问题标题】:C2100 illegal indirection Comparator and SetsC2100 非法间接比较器和集合
【发布时间】:2016-11-12 04:14:16
【问题描述】:

我正在尝试按值而不是键对集合进行排序。我一直遇到非法间接问题。每次我尝试通过 LRU 缓存插入时都会发生错误。我认为这个问题与不使用指针有关,所以我将 a 和 b 转换为指针,但它不起作用。

struct comp {
    bool operator ()(const pair<int, int>& a, const pair<int, int>& b) {
        return a.second < b.second;
    }
};
typedef set<pair<int, int>, comp> S;

struct LRUCache {
    S cache;
    typedef S::iterator it;
    int cap;

    LRUCache(int capacity) {
        cap = capacity;
    }

    int get(int key) {

    }

    void setC(int key, int value) {
        cache.insert(key, value);
    }

    void initialize() {
        vector<int> temp{ 5,20,35,20,83,17,5,1,0,239,242,42 };
        for (int i = 0; i < temp.size(); i++) {
            setC(i, temp[i]);

        }
    }

};

int main()
{
    LRUCache test(5);
    test.initialize();
    test.setC(1, 5);
    test.setC(12, 20);
    return 0;
}

【问题讨论】:

  • 完整的错误是什么?你可能也想处理这个例子,因为它编译得很好。 ideone.com/GjT4aD
  • 对不起。我的 IDE 中只有那部分出现了同样的错误,所以我认为它只是那段代码。
  • cache.insert(make_pair(key, value));cache.insert({key, value}); 可能是您想要的。
  • 另外,我不建议使用像S 这样的单字母名称来定义您的类型。这不会向阅读您的代码的人传达任何信息。相反,将其命名为 IntSet 或更具描述性的名称。

标签: c++ set


【解决方案1】:

问题是您的std::setstd::pair&lt;int, int&gt; 组成,并且您没有使用此行将该类型插入您的集合中:

cache.insert(key, value);

这会调用带有两个参数的set::insert 函数,编译器会尝试匹配您使用one of the overloads here that takes two parameters 传递的两个int 值。

您想要做的是使用单个参数调用set::insert,即std::pair&lt;int, int&gt;

将上面的行改为:

cache.insert({key, value});

cache.insert(std::make_pair(key, value));

Live Example


如果您将usingtypedef 用于std::pair,您也可以更清楚地看到这个问题。

typedef std::pair<int, int> IntPair;
typedef std::set<IntPair, comp> PairSet;
//...
PairSet cache;
//...
cache.insert(IntPair(key, value));

您知道您想将IntPair 插入到集合中,因此上面的代码可以顺利编译。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-04-15
    • 2016-05-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多