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、それが指す整数の値を変更することはできません。

マップが実際に期待するのは ですが、のみ ( なし)const int*& kを指定すると、マップはこれを自動的に変換します。int*const

[編集]

また、関数の最後に別の const がまだあるため、変更しても関数MyMapによってオブジェクトを変更できないことに注意してください。最後にあるこの const は、関数を定数として宣言します。これは、関数が実行されている現在のオブジェクトを変更できないことを意味します。それを変更しようとしたり、それを変更する可能性のあるものを呼び出したりしようとすると、コンパイラ エラーが発生します。(免責事項: とにかく、const 関数内からクラスを変更する方法はありますが、それは別のトピックです。)fooconst int*int*foo

于 2014-03-27T12:01:37.470 に答える
0

実際には、適切なコンパイラ メッセージが答えを与えることができます。2 つのオーバーロードの 1 つ (the constone) の場合:

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

const int*へのポインタconst intです。このメソッドは、 (non- )への参照であるconst key_type&、つまりconst int*&引数を期待します。constconstint*

混乱した場合は、 と書くことをお勧めしますconst int*int const*、これは同じことです。そうすれば、違いがconst int*&より明確にわかります。

コードを機能させるには、int*代わりにconst int*.

于 2014-03-27T12:07:28.907 に答える