由於沒有要求可以從指向基礎值類型的指針構造(const_)iterator
,因此沒有可移植的方法來執行您正在嘗試的操作。 libstdC++碰巧提供了這樣的構造函數,但VS標準庫實現不提供。相反,其(const_)iterator
構造函數接受一個指向底層值類型的指針和一個指向容器本身的指針,該指針用於在調試構建過程中執行額外的驗證。
最簡單的解決方案是用unsigned char const *
替換std::vector<unsigned char>::const_iterator
。原始指針位於RandomAccessIterator類別中,與vector::(const_)iterator
相同。
unsigned char const *foo::begin() {
return value;
}
unsigned char const *foo::end() {
return value + length;
}
如果您需要迭代器是一個類類型,那麼你需要創建一個自定義的迭代器。雖然這可以從頭開始,但使用Boost.IteratorFacade會更容易,它將提供一大堆構建自定義迭代器所需的樣板。
#include <boost/iterator/iterator_facade.hpp>
struct const_foo_iterator : boost::iterator_facade<const_foo_iterator,
unsigned char const,
boost::random_access_traversal_tag>
{
const_foo_iterator() = default;
const_foo_iterator(unsigned char const *iter) : iter(iter) {}
private:
friend class boost::iterator_core_access;
void increment() { ++iter; }
void decrement() { --iter; }
void advance(std::ptrdiff_t n) { iter += n; }
std::ptrdiff_t distance_to(const_foo_iterator const& other) const
{ return iter - other.iter; }
bool equal(const_foo_iterator const& other) const
{ return this->iter == other.iter; }
unsigned char const& dereference() const { return *iter; }
unsigned char const* iter = nullptr;
};
const_foo_iterator foo::begin() {
return value;
}
const_foo_iterator foo::end() {
return value + length;
}
static_assert(std::is_same<std::iterator_traits<const_foo_iterator>::value_type,
unsigned char>::value, "value_type");
static_assert(std::is_same<std::iterator_traits<const_foo_iterator>::pointer,
unsigned char const *>::value, "pointer");
static_assert(std::is_same<std::iterator_traits<const_foo_iterator>::iterator_category,
std::random_access_iterator_tag>::value, "iterator_category");
Live demo
對不起,您正在利用VS2013中不存在的gcc的實現細節。 const_iterator的定義不在你的控制範圍之內,它不包含任意指針的能力。 –
您可以將類型從'std :: vector :: iterator'更改爲'const unsigned char *'或自定義迭代器? –
user1781290
或者,如果'value'總是來自一個向量,你能改變它爲'std :: vector :: iterator value;'? –
aschepler