我有一個鏈表結構:使用boost :: iterator_facade <>
struct SomeLinkedList
{
const char* bar;
int lots_of_interesting_stuff_in_here;
DWORD foo;
SomeLinkedList* pNext;
};
這是現有的API的一部分,我不能改變它。
我想添加迭代器支持。該庫似乎是理想的目的。
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:
我已經試過修改提領型:
class SomeIterator
: public boost::iterator_facade< SomeIterator,
const SomeLinkedList,
boost::forward_traversal_tag >
{
// ...
const SomeLinkedList* dereference() const { return node_; };
,但我得到的原始錯誤:
error C2664: 'void (const SomeLinkedList *)' : cannot convert parameter 1 from 'const SomeLinkedList' to 'const SomeLinkedList *'
Re:編輯。你仍然在說'value_type'將會是'SomeLinkedList'。你可能根本不需要最後一個參數,因爲默認值應該可以工作。另外,你是否改變了'dereference'成員的返回類型? - 但是,因爲你的代碼庫看起來並不是特別的stdlib風格,所以編寫你自己的foreach到這個特定的鏈表是不是更簡單(因爲我懷疑其他的stdlib算法是否能夠很好地工作一個奇怪的迭代器無論如何沒有嚴重的額外工作)? – UncleBens 2010-08-18 17:30:19
@UncleBens - 見編輯2.另外,我不認爲這將是很多額外的工作。只是重載比較運算符或二元謂詞。 – PaulH 2010-08-18 17:40:12
似乎你可能需要'const SomeLinkedList *'這兩個'value_type'和'reference'參數。在引用指針時可能會有些不可思議。 - 關於額外的工作:適合你。對我來說,使用C風格的字符串與stdlib是太多的工作,因爲它從來沒有被設計來支持那些開箱即用的。 – UncleBens 2010-08-18 17:49:03