在set中搜索const键类型会导致编译错误

时间:2016-11-02 08:29:08

标签: c++ c++11 set g++ c++14

我有一个set的指针类型但是使用const指针进行搜索是不可能的,我的代码如下所示:

#include <set>
#include <string>

using namespace std;

struct Node
{
  string name;
  int id;

  Node(const string &name, int id):
    name(name),
    id(id)
  {}
};

struct Comprator
{
  bool operator()(const Node* lhs, const Node* rhs) const
  {
    return lhs->id < rhs->id;
  }
};

int
main(int argc, char *argv[])
{
  set<Node*, Comprator> d;

  Node* node3 = new Node("foo", 4);

  d.insert(node3);

  const Node* node4 = node3;

  auto it = d.find(node4);

  return 0;
}

我收到以下错误:

main.cc: In function ‘int main(int, char**)’:
main.cc:38:25: error: invalid conversion from ‘const Node*’ to ‘std::set<Node*, Comprator>::key_type {aka Node*}’ [-fpermissive]
   auto it = d.find(node4);
                         ^
In file included from /usr/include/c++/5/set:61:0,
                 from main.cc:2:
/usr/include/c++/5/bits/stl_set.h:694:7: note:   initializing argument 1 of ‘std::set<_Key, _Compare, _Alloc>::iterator std::set<_Key, _Compare, _Alloc>::find(const key_type&) [with _Key = Node*; _Compare = Comprator; _Alloc = std::allocator<Node*>; std::set<_Key, _Compare, _Alloc>::iterator = std::_Rb_tree_const_iterator<Node*>; std::set<_Key, _Compare, _Alloc>::key_type = Node*]’
       find(const key_type& __x)

如果我将Node*更改为int,则每件事情都有效,我不明白这个问题。我使用的是c ++ 11和g ++ - 5.4.0。

修改

正如@Piotr Skotnicki在c ++ 14的评论中解释的那样,下面的比较器代码可以编译:

struct Comprator
{
  using is_transparent = void;

  bool operator()(const Node* lhs, const Node* rhs) const
  {
    return lhs->id < rhs->id;
  }
};

1 个答案:

答案 0 :(得分:3)

const Node*(一个指向const Node的非const指针)不是const键 - 它是Node* const(指向Node的const指针)。

set更改为一组Node const*,或将指向非常量Node的指针传递给它。

以下是更深入的解释:link