0

Windowsコードをクロスプラットフォームビューに書き直す必要があります。次に例を示します。

std::unordered_set<Type>::iterator it = ...;
it._Ptr->_Myval->...

すべてのコードに_Ptrイテレータのメンバーがありますが、ドキュメントで見つけることができません。Visual Studio(stlの実装)で動作すると思います。それを置き換える方法はありますか?そして、何_Myvalですか?


UPD:

for(std::unordered_set<QuadTreeOccupant*>::iterator it = ...)
   it->aabb;

class QuadTreeOccupant
{
   public:
      AABB aabb;
};

そして行のエラーit->aabb

エラー:'* it.std :: __ detail :: _ Hashtable_iterator <_Value、__constant_iterators、__cache> :: operator-> with _Value = qdt :: QuadTreeOccupant *、bool __constant_iterators = true、bool _cache=のメンバー'aabb'のリクエストfalse、std :: _detail :: _ Hashtable_iterator <_Value、__constant_iterators、__cache> :: pointer = qdt :: QuadTreeOccupant * const *'、これは非クラスタイプ' qdt :: QuadTreeOccupant * const'</ p>

4

3 に答える 3

4

これらはunordered_map、VC の実装に固有の実装の詳細です。_Ptrandへの参照を削除して、_Myval次のいずれかを使用する必要があります。

  • it->
  • (*it).

代わりにit._Ptr->_Myval.

于 2012-02-09T00:09:14.727 に答える
1

更新に関しては、イテレータは要素への「ポインタのようなもの」であるため*it、含まれている要素を参照します。ただし、メンバー要素はポインターであるため、を使用して要素のメンバーにアクセスすることはできません。it->したがって、反復子は二重ポインターに「似ています」。

簡単に言うと、次のことを行う必要があります。

(*it)->aabb;

since*itを与えると、演算子QuadTreeOccupant*を介してそのメンバーにアクセスできます。->

- -編集 - -

遅すぎる...

于 2012-02-09T00:25:11.533 に答える
0

は、アクセスしてはならない実装の詳細の_Ptrように見えます (つまり、おそらく `private にする必要があります)。どのような場合でも使用しないでください: アンダースコアで始まり、大文字が続く名前は立ち入り禁止領域です明示的に招待された人を除くすべての人。これらは C++ システムの単なる実装者です (コンパイラや標準ライブラリの作成者など)。

使いたいだけ

it->...
(*it). ...

... イテレータの要素にアクセスします。

于 2012-02-09T00:11:08.743 に答える