2012-02-09 42 views
0

我必须将windows代码重写为跨平台视图。这里是例子:unordered_set from std

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

Everywere在代码中存在迭代_Ptr成员,但在我的文档无法找到它。我认为它适用于visual studio(它是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

这些都是unordered_map实施细则具体到VC的实现。你应该只删除提及_Ptr_Myval和使用两种:

  • it->
  • (*it).

代替it._Ptr->_Myval.

+0

你可以看看更新,请? – Ockonal 2012-02-09 00:20:54

+4

@Ockonal:'(* it) - > aabb',因为'hash_map'包含*指针*,它也需要解除引用 – Xeo 2012-02-09 00:22:09

0

_Ptr看起来像一个实现细节,你不该没有权限(即它可能应该是私有的),你不应该在任何情况下使用:以下划线开头,后面跟着一个ca除了明确邀请的人以外,每个人都必须写一封信。这些只是C++系统的实施者(例如,编译器和标准库编写器)。

你只是想用

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

...访问迭代器的元素。

1

至于更新:迭代器是“像一个指针”元素,所以*it引用包含的元素; 但是,因为你的成员元素是一个指针,所以你不能使用it->来访问你的元素的成员,因此迭代器就像“双指针”一样。

长话短说,你要做的:

(*it)->aabb; 

因为*it给你一个QuadTreeOccupant*,然后你可以通过->运营商访问其成员。

---编辑---

为时已晚......

相关问题