나는 연결리스트 구조를 가지고 :사용 부스트 :: iterator_facade <>
struct SomeLinkedList
{
const char* bar;
int lots_of_interesting_stuff_in_here;
DWORD foo;
SomeLinkedList* pNext;
};
그것은 기존의 API의 일부이며 나는 그것을 변경할 수 없습니다.
이터레이터 지원을 추가하고 싶습니다. boost::iterator_facade<>
라이브러리가 이상적이었습니다.
class SomeIterator
: public boost::iterator_facade< SomeIterator,
const SomeLinkedList,
boost::forward_traversal_tag >
{
public:
SomeIterator() : node_(NULL) {};
explicit SomeIterator(const SomeLinkedList* p) : node_(p) {};
private:
friend class boost::iterator_core_access;
void increment() { node_ = node_->pNext; };
bool equal(SomeIterator const& other) const { /*some comparison*/; };
SomeLinkedList const& dereference() const { return *node_; };
SomeLinkedList const* node_;
}; // class SomeIterator
목표는 불행하게도 std::for_each
void DoSomething(const SomeLinkedList* node);
SomeLinkedList* my_list = CreateLinkedList();
std::for_each(SomeIterator(my_list), SomeIterator(), DoSomething);
같은 표준 라이브러리 함수에서 사용할 수있을 것입니다, 나는 값이 아닌 포인터 목록을 통과하려고 없다는 오류를 받고 있어요 .
error C2664: 'void (const SomeLinkedList *)' : cannot convert parameter 1 from 'const SomeLinkedList' to 'const SomeLinkedList *'
SomeIterator
을 올바르게 변경하려면 어떻게해야합니까?
감사합니다, PaulH
편집 : 나는이 시도했다 :
class SomeIterator
: public boost::iterator_facade< SomeIterator,
SomeLinkedList,
boost::forward_traversal_tag,
SomeLinkedList* >
{
// ...
을하지만 난이 컴파일러 오류가 발생합니다 :
error C2664: 'boost::implicit_cast' : cannot convert parameter 1 from 'SomeLinkedList **' to 'boost::detail::operator_arrow_proxy<T>
에드 그것은 2 : 당신의 반복자가 역 참조하면
error C2664: 'void (const SomeLinkedList *)' : cannot convert parameter 1 from 'const SomeLinkedList' to 'const SomeLinkedList *'
Re : 편집 : 당신은 여전히'value_type'이'SomeLinkedList'가 될 것이라고 말하고 있습니다. 마지막 매개 변수는 전혀 필요하지 않습니다. 기본값이이를 위해 작동해야하기 때문입니다. 또한 '역 참조'멤버의 반환 유형을 변경 했습니까? -하지만 여전히 코드베이스가 stdlib 스타일로 보이지 않기 때문에 (다른 어떤 stdlib 알고리즘도 이와 같이 잘 작동하지 않을 것이므로이 특정 링크 된 목록에 대한 자신 만의 foreach를 작성하는 것이 더 간단하지 않겠는가?) 어쨌든 심각한 추가 작업없이 기괴한 반복자)? – UncleBens
@UncleBens - 편집 2 참조. 또한 추가 작업이 많지 않을 것이라고 생각합니다. 비교 연산자 또는 2 진 술어에 과부하 만하십시오. – PaulH
'value_type'과'reference' 매개 변수 모두에'const SomeLinkedList *'가 필요할 것 같습니다. 아마도 포인터에 대한 참조를 취할 때 어떤 이상한 점이있을 것입니다. - 추가 작업에 관하여 : 당신에게 어울립니다. stdlib에서 C 스타일의 문자열을 사용하는 것은 나에게 너무 많은 작업이다. – UncleBens