1

这是这个简单的代码

#include <map>

class MyMap : public std::multimap<int*, int*>
{
    public:
    void foo(const int* bar) const
    {
        equal_range(bar);
    }
};


int main()
{
    MyMap myMap;

    int number;
    myMap.foo(&number);

    return 0;
}

它不编译,并给出以下错误

error C2663: 'std::_Tree<_Traits>::equal_range' : 2 overloads have no legal conversion for 'this' pointer

我看过很多关于这个错误的话题,似乎这是一个const问题。如果我foo(const int* bar)变成foo(int* bar).

问题是,我看不到foo内容应该如何改变我的 MyMap 对象。std::multimap提出一个 const 版本equal_range

http://www.cplusplus.com/reference/map/multimap/equal_range/

我的问题是什么?

谢谢

4

3 回答 3

1

检查equal_range的定义:

pair<const_iterator,const_iterator> equal_range (const key_type& k) const;

它期望对key_type:的持续引用const key_type& k

您试图提供的是一个指向常量整数的指针:const int* bar

即使两个值都是,为什么这不起作用const

  • 对整数的常量引用const int& foo意味着您不能让foo引用另一个整数,但允许更改引用的整数的值。
  • 指向常量整数的指针const int* foo意味着您可以让foo指向另一个整数,但不能更改它指向的整数的值。

地图实际期望的是 a const int*& k,但如果您int*只提供 a (没有const),地图会自动转换它。

[编辑]

另请注意,即使您更改为MyMap,您的函数仍然无法更改对象,因为函数末尾仍有另一个 const 。最后的这个 const 将函数声明为常量,这意味着它不能修改执行它的当前对象。如果它试图修改它或调用任何可能修改它的东西,你会得到一个编译器错误。(免责声明:无论如何,有一些方法可以从 const 函数中修改类,但这是另一个主题。)fooconst int*int*foo

于 2014-03-27T12:01:37.470 回答
0

如果事实上正确的编译器消息可以给你答案。对于两个重载之一(const一个):

/usr/local/include/c++/v1/map:1836:41: note: candidate function not viable: 1st argument ('const int *')
      would lose const qualifier

const int*是指向 a 的指针const int。该方法需要一个const key_type&,即const int*&参数,它是const对 a (non- const)的引用int*

感到困惑时,更喜欢写const int*int const*,这是一回事。然后你会const int*&更清楚地看到差异。

要使您的代码正常工作,请使用int*而不是const int*.

于 2014-03-27T12:07:28.907 回答
0

我认为问题与key_type. 一方面,您有一个多图,key_type=int*而另一方面,您正在传递 a ,key_type=const int*因此试图将 const 限定符放在key_type. 我也对此感到困惑,因为我正在扩展key_type我的想法以获得const int*&应该兼容的内容。但是,不匹配发生在其key_type本身的更早。至少这是我能想到的唯一合乎逻辑的解释。

我的建议是key_type const int*让你的函数参数保持原样。毕竟,为什么需要一个指向可变值的指针作为映射的键?

于 2017-05-25T03:37:54.347 回答