15

こんにちはすべて私はメンバー関数に次のものを持っています

int tt = 6; 
vector<set<int>>& temp = m_egressCandidatesByDestAndOtMode[tt]; 
set<int>& egressCandidateStops = temp.at(dest);

および次のメンバー変数の宣言

map<int, vector<set<int>>> m_egressCandidatesByDestAndOtMode;

ただし、コンパイル時にエラーが発生します(Intelコンパイラ11.0)

1>C:\projects\svn\bdk\Source\ZenithAssignment\src\Iteration\PtBranchAndBoundIterationOriginRunner.cpp(85): error: no operator "[]" matches these operands
1>            operand types are: const std::map<int, std::vector<std::set<int, std::less<int>, std::allocator<int>>, std::allocator<std::set<int, std::less<int>, std::allocator<int>>>>, std::less<int>, std::allocator<std::pair<const int, std::vector<std::set<int, std::less<int>, std::allocator<int>>, std::allocator<std::set<int, std::less<int>, std::allocator<int>>>>>>> [ const int ]
1>          vector<set<int>>& temp = m_egressCandidatesByDestAndOtMode[tt]; 
1>                                                                    ^

私はそれが愚かなことでなければならないことを知っていますが、私が間違ったことを見ることができません。

UPDATEこれをconstメンバー関数から呼び出しているので、メンバー変数の型はconstであるため、次のようなもので修正する必要があると思いました。

int dest = 0, tt = 6; 
const set<int>& egressCandidateStops = m_egressCandidatesByDestAndOtMode[tt].at(dest); 

しかし、サイコロはありません...それでも同じエラーです。

4

2 に答える 2

26

オペランドの型: const std::map < int …</p>

map::operator[]では機能しませんconst map

私は数日前にこれに答えました。

map::operator[] は少し奇妙です。これは次のことを行います。

  1. キーを探します。
  2. 見つかった場合は返却してください。
  3. そうでない場合は、それを挿入し、関連する値をデフォルト構築します。
  4. 次に、新しい値への参照を返します。

ステップ 3 は constness と互換性がありません。機能の異なる 2 つの operator[] オーバーロードを使用するのではなく、この言語では、const オブジェクトに対して map::find を使用する必要があります。

于 2010-05-05T10:10:58.277 に答える
7

のプロトタイプ[]

 data_type& operator[](const key_type& k)

つまり、非 const 操作であるため、 const メンバー関数からメンバーに対して呼び出すことはできません。

コードを次のように変更できます。

std::map<...>::const_iterator where = m_egressCandidatesByDestAndOtMode.find(tt);
if (egressCandidatesByDestAndOtMode.end() != where) {
    const vector<set<int>>& temp = where->second;
}
于 2010-05-05T10:11:10.480 に答える