为什么我不能在std :: set中的元素上调用非const成员函数?

时间:2016-09-30 12:49:52

标签: c++ compiler-errors iterator member-functions stdset

我有下一个代码:

set<Item> temp_items;
set < Item >::iterator it;
temp_items = user->second.get_items();
for (it = temp_items.begin(); it != temp_items.end(); it++)
{
    if (counter == (choice - 1))
    {
        it->get_count();
    }
}

我试图调用的项目功能是:

int Item::get_count() { return _count; }

我在这里没有任何const类型可以阻止我访问item对象,但仍然,我收到了下一条消息:

  

该对象具有与成员函数

不兼容的类型限定符      

对象类型是const

我该如何解决?

2 个答案:

答案 0 :(得分:1)

set始终会为您提供const的对象。在您的循环中,*it指的是const Item。您正在尝试调用不是get_count()限定的成员函数const - 只允许在非const对象上调用它,因此失败。

您可以通过标记您的函数const

来解决此问题
int get_count() const { return _count; }
               ^^^^^^^

注意:您正在调用一个没有副作用且不使用其返回类型的函数。这实际上并没有做任何事情。

答案 1 :(得分:0)

简而言之:你只能在set迭代器上调用const函数。

<强>解释

该集在内部按Item排序。因此,当您访问引用(通过迭代器)时,您不允许执行某些操作来更改Item的值(这在早期的c ++版本中实际上很容易实现)。

当您意外更改值时,会发生什么情况,这不会改变内部&#34;订购&#34;相应地,即使对象是&#34;那么&#34;查找也会失败。在理论上。

想象一下这个数字你有一套

1 2 3 4 5 6 7 8 9

现在您将9的值更改为0(通过引用)

1 2 3 4 5 6 7 8 0

现在当你寻找一个0并且容器有一个智能查找时,它将使用二进制搜索并假设0在最左边。这将导致0未找到。

注意:这只是一个简化的例子。没有明确说明如何实现一套)

这就是为什么对键的引用是const引用以及为什么你只能在那些上调用const函数(同样适用于地图上的键)。