7

これはgcc4.1.2/ RedHat5でのコンパイルに失敗します:

#include <string>
#include <vector>
#include <map>

class Toto {
public:
    typedef std::string SegmentName;
};

class Titi {
public:
    typedef Toto::SegmentName SegmentName; // import this type in our name space
    typedef std::vector<SegmentName> SegmentNameList;
    SegmentNameList segmentNames_;
    typedef std::map<SegmentName, int> SegmentTypeContainer;
    SegmentTypeContainer segmentTypes_;

    int getNthSegmentType(unsigned int i) const {
        int result = -1;

       if(i < segmentNames_.size())
       {
           SegmentName name = segmentNames_[i];
           result = segmentTypes_[ name ];
       }
       return result;
    }
};

エラーは次のとおりです。

error: no match for 'operator[]' in '(...)segmentTypes_[name]'
/usr/lib/gcc/x86_64-redhat-linux/4.1.2/../../../../include/c++/4.1.2/bits/stl_map.h:340:
note: candidates are: _Tp& std::map<_Key, _Tp, _Compare, _Alloc>::operator[](const _Key&)
[with _Key = std::basic_string<char, std::char_traits<char>, std::allocator<char> >, _Tp = int, _Compare = std::less<std::basic_string<char, std::char_traits<char>, std::allocator<char> > >, _Alloc = std::allocator<std::pair<const std::basic_string<char, std::char_traits<char>, std::allocator<char> >, int> >]

なんで ?マップはかなり単純です。これはtypedefと関係があると思いますが、何が問題なのですか?

[編集]すべてを削除してどこでもtypedefs使用しstd::stringても、問題は解決しません...マップを誤用していますか?

4

2 に答える 2

17

std::map::operator[]は非定数であり、constメソッドから使​​用しようとしています。

これは、 :std::map::findを返すを使用して実現できます。const_iterator

SegmentTypeContainer::const_iterator iter = segmentTypes_.find(name);

C ++ 11を使用している場合はstd::map::at、を使用することもできます。これにより、キーがマップに見つからない場合に例外がスローされます。

result = segmentTypes_.at(name);
于 2013-03-27T14:07:02.857 に答える
12

std::map::operator[]はメソッドではありませんが、クラスconstのメソッドから呼び出しています。constこれは、キーが存在しない場合に要素を追加するためです。

あなたはC++11を使うことができますat()

result = segmentTypes_.at(name); // throws exception if key not present.

またはを使用しますstd::map::find

SegmentTypeContainer::const_iterator it = segmentTypes_.find(name);
if (it != segmentTypes_.end())
{
  // OK, element with key name is present
  result = it->second;
}
于 2013-03-27T14:08:00.317 に答える