gpt4 book ai didi

c++ - 迭代器类 : compiler error in g++ while doing iterator add or subtract (works in VS2010)

转载 作者:塔克拉玛干 更新时间:2023-11-03 02:05:24 24 4
gpt4 key购买 nike

我正在用 C++ 实现一个数组(出于各种原因,其中之一是了解自定义迭代器)。

在对其进行测试时,我注意到它无法在 g++ 4.4 中编译,但在 Visual Studio 2010 中运行良好。

我在下面包含了一个示例程序。在那里,我打印出玩具数组的最后一个值,这是我使用模板和附带的迭代器类实现的。我得到的编译器错误如下:

$ g++-4.4 -ansi -Wall  -std=c++0x mybuffer.cpp -o mybuffer
In file included from /usr/include/c++/4.4/bits/stl_algobase.h:69,
from /usr/include/c++/4.4/memory:49,
from mybuffer.cpp:1:
/usr/include/c++/4.4/bits/stl_iterator.h: In member function ‘std::reverse_iterator<_Iterator> std::reverse_iterator<_Iterator>::operator+(typename std::iterator_traits<_Iter>::difference_type) const [with _Iterator = CMyItr<CMyBuff<double>, double>]’:
mybuffer.cpp:205: instantiated from here
/usr/include/c++/4.4/bits/stl_iterator.h:221: error: passing ‘const CMyItr<CMyBuff<double>, double>’ as ‘this’ argument of ‘CMyItr<T, typename T::value_type> CMyItr<T, elem_type>::operator-(typename T::difference_type) [with T = CMyBuff<double>, elem_type = double]’ discards qualifiers

如果我执行 *(RItr+1) 操作会发生错误,如果我执行 *(++RITr) 操作则不会。但是,无论哪种情况,它都适用于 Visual Studio 2010。

我在 g++ 2.95 中也遇到了同样的编译器错误。尚未在 Visual Studio 6 中尝试过。

有人可以解释我做错了什么以及如何解决吗?

谢谢。PS:使用 g++ 4.6 是另一个问题,但那是以后的事。

//-------------------------------------------- example code ----------------//
//------------------------------------------------------------------------------//
//------------------------------------------------------------------------------//
#include <memory>
#include <iostream>
#include <iterator>
template < typename T, typename elem_type=typename T::value_type>
class CMyItr {

public:

typedef T BuffType;
typedef CMyItr<T> self_type;
typedef CMyItr<self_type, elem_type> iterator;
typedef typename std::bidirectional_iterator_tag iterator_category;
typedef typename BuffType::value_type value_type;
typedef typename BuffType::size_type size_type;
typedef typename BuffType::pointer pointer;
typedef typename BuffType::const_pointer const_pointer;
typedef typename BuffType::reference reference;
typedef typename BuffType::const_reference const_reference;
typedef typename BuffType::difference_type difference_type;


CMyItr( BuffType *pB, size_type pos):
PtrItr_(pB), PtrPos_(pos){
};



friend class CMyItr< const T, const elem_type>;

elem_type &operator*(){
return (*PtrItr_)[PtrPos_];
};

elem_type *operator->(){
return &(operator*());
};

self_type & operator++(){
++PtrPos_;
return *this;
};

self_type operator++(int){
self_type tmp(*this);
++(*this);
return tmp;
};

self_type operator+(difference_type n) {
self_type tmp(*this);
tmp.PtrPos_ = tmp.PtrPos_ + n;
return tmp;
};

self_type &operator+=(difference_type n){
PtrPos_ = PtrPos_ + n;
return *this;
};


self_type & operator--(){
--PtrPos_;
return *this;
};
/*!
The decrement operator which decrements the position index.
*/
self_type operator--(int){
self_type tmp(*this);
--(*this);
return tmp;
};

self_type operator-(difference_type n) {
self_type tmp(*this);
tmp.PtrPos_ = tmp.PtrPos_ - n;
return tmp;
};

self_type &operator-=(difference_type n){
PtrPos_ -= n;
return *this;
};

bool operator!=(const self_type &other) const {
return PtrPos_ != other.PtrPos_ && PtrItr_ == other.PtrItr_;
};

bool operator==(const self_type &other) const {
return PtrPos_ == other.PtrPos_ && PtrItr_ == other.PtrItr_;
};

private:
BuffType * PtrItr_;
size_type PtrPos_;
};


//----------------------------------------------------------------------//
//----------------------------------------------------------------------//
template < typename T > class CMyBuff {

public:
enum {default_size = 4 };

typedef CMyBuff<T> self_type;
typedef T value_type;
typedef T & reference;
typedef const T & const_reference;
typedef T * pointer;
typedef const T * const_pointer;
typedef size_t size_type;
typedef ptrdiff_t difference_type;
typedef CMyItr<self_type> iterator;
typedef CMyItr<const self_type> const_iterator;
typedef std::reverse_iterator<iterator> reverse_iterator;
typedef std::reverse_iterator<const iterator> const_reverse_iterator;

/*! Starting for forward iterator.*/
iterator begin(){
return iterator(this, 0);
};
/*! Forward iterator should go till here.*/
iterator end(){
return iterator(this, Size_);
};

/*! Starting for constant forward iterator.*/
const_iterator begin() const {
return const_iterator(this, 0);
};
/*! Constant forward iterator should go till here.*/
const_iterator end() const {
return const_iterator(this, Size_);
};

/*! Reverse iterator starts from here.*/
reverse_iterator rbegin(){
return reverse_iterator(end());
}
/*! Reverse iterator end.*/
reverse_iterator rend() {
return reverse_iterator(begin());
}

/*! Constant reverse iterator starting point.*/
const_reverse_iterator rbegin() const {
return const_reverse_iterator(end());
}
/*! Constant reverse iterator should end here.*/
const_reverse_iterator rend() const {
return const_reverse_iterator( begin());
}

/* Ctor for my buffer*/
explicit CMyBuff(size_type capacity = default_size):
Ptr_(NULL),
Size_(capacity) {
Ptr_ = new value_type [sizeof(value_type) * Size_];
Ptr_[0] = 0;
Ptr_[1] = 1;
Ptr_[2] = 8;
Ptr_[3] = 27;
};


~CMyBuff() {
delete [] Ptr_;
}


reference operator[](size_type i){
return rAtUnChecked(i);
};

const_reference operator[](size_type i) const {
return rAtUnChecked(i);
};

size_type size() const {
return Size_;
};


reference rAtUnChecked(size_type k) const {
return Ptr_[k];
};

private:
pointer Ptr_;
size_type Size_;
};


//------------------------------------------------------------------//
//----------------------------------------- MAIN ------------------//
// Use the following command line to compile:
// g++-4.4 -ansi -Wall -std=c++0x mybuffer.cpp -o mybuffer
int main(){

CMyBuff<double> Buffer;
CMyBuff < double >::reverse_iterator RItr = Buffer.rbegin();

//prints last but one element
std::cout << *(++RItr) << std::endl;

// The following doesn't compile on g++. Get const related error
// containing "discards qualifier"
//std::cout << *(RItr + 1) << std::endl;

return 0;
}
//-------------------------------------------------------------------------------//

//----------------------------------------代码结束----------------//

最佳答案

您的迭代器的 operator- 不会改变状态,因此它应该是常量。

关于c++ - 迭代器类 : compiler error in g++ while doing iterator add or subtract (works in VS2010),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6688178/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com