2012-02-09 16 views
0

クロスプラットフォームビューにWindowsコードを書き直す必要があります。ここでは一例です:コード内標準からunordered_set

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

Everywereが_Ptrメンバーはイテレータであるが、私はドキュメントでそれを見つけることができません。私はそれがビジュアルスタジオ(それはstlの実装です)と動作すると思います。任意のアイデアをどのように置き換えるには? _Myvalとは何ですか?


UPD:

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

class QuadTreeOccupant 
{ 
    public: 
     AABB aabb; 
}; 

そしてラインit->aabbでエラー:

error: request for member ‘aabb’ in ‘* it.std::__detail::_Hashtable_iterator<_Value, __constant_iterators, __cache>::operator-> with _Value = qdt::QuadTreeOccupant*, bool __constant_iterators = true, bool _cache = false, std::_detail::_Hashtable_iterator<_Value, __constant_iterators, __cache>::pointer = qdt::QuadTreeOccupant* const*’, which is of non-class type ‘qdt::QuadTreeOccupant* const’

答えて

4

者はVCの実装に固有unordered_mapの実装の詳細です。あなただけ_Ptr_Myvalへの参照を削除し、のいずれかを使用する必要があります。これはあなたがshouldn実装の詳細のようなit._Ptr->_Myval.

+0

はあなたがアップデートで見ることができ、してください? – Ockonal

+4

@Ockonal: '(* it) - > aabb'、' hash_map'には*ポインタ*が含まれているので、逆参照も必要です – Xeo

0

_Ptrルックスの代わりに

  • it->
  • (*it).

アクセス権がありません(つまり、おそらく `privateであるべきです)。あなたはどんな場合でも使うべきではありません:アンダースコアで始まり、ca pital letterは、明示的に招待された人を除いて、誰のためのものでもありません。これらは、C++システムの実装者です(例:コンパイラおよび標準ライブラリライタ)。

あなただけのイテレータの要素にアクセスするために...

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

を使用します。

1

更新の場合:イテレータは要素の「ポインタと似ている」ため、*itは含まれている要素を参照します。 しかしの場合は、メンバー要素がポインタであるため、it->を使用して要素のメンバーにアクセスすることはできません。したがって、イテレータはダブルポインタに似ています。

かいつまんで、あなたがしなければならない:*itはあなたにQuadTreeOccupant*を与え、あなたは->オペレータ経由して、そのメンバーに、次にアクセスすることができますので、

(*it)->aabb; 

を。

---編集---手遅れ

...