1

我正在尝试为我的基于数组的列表类构建一个自定义的 const_iterator 嵌套类。这是课程

class const_iterator {
private:
   const T *p;
public:
    const_iterator(const T *l) {
        p = l;
    }
    const_iterator(const_iterator &ci) { p=ci.p;}
    const T &operator*() const {return *p;}
    bool operator==(const iterator &i) const {
        if(*p==*i)
            return true;
        else
            return false;
    }
    bool operator!=(const_iterator &i) const {
        if(*p!=*i)
            return true;
        else
            return false;
    }
    const_iterator &operator=(const_iterator &i) const {
        p=i.p;
        return this;
    }
    const_iterator &operator++() const {
        return const_iterator(p+1);
    }
    const_iterator &operator--() const {
        return const_iterator(p-1);
    }

    const_iterator operator++(int) const {
        p = p+1;
        return const_iterator(p-1);
    };
    const_iterator operator--(int) const {
        p=p-1;
        return const_iterator(p+1);
    }

};

但是,当我回到课堂开始、结束等时,如下所示:

iterator begin() {
    return iterator(&data[0]);
}
const_iterator begin() const {
    return const_iterator(&data[0]);
}
iterator end() {return iterator(&data[place+1]);}
const_iterator end() const {return const_iterator(&data[place+1]);}

const_iterator cbegin() const {
    return const_iterator(&data[0]);
}
const_iterator cend() const {return const_iterator(&data[place+1]);}

我收到一个错误:“在我的 cbegin 和 cend 上没有用于初始化 'ArrayList::const_iterator”的匹配构造函数。我知道这可能是我不了解 C++ 的愚蠢行为。在此先感谢您的帮助!

4

2 回答 2

1

删除const_iterator复制构造函数(因为它不需要),或者使复制构造函数采用const const_iterator&.

这是一个最小的例子:

template <typename T>
class ArrayList
{
    public:
        class const_iterator {
        private:
            const T *p;
        public:
            const_iterator(const T *l) {
                p = l;
            }
            const_iterator(const const_iterator &ci) : p(ci.p) {}
        };

        T data[10];

        const_iterator cbegin() const {
            return const_iterator(&data[0]);
    }
};

int main()
{
    ArrayList<int> a;
    ArrayList<int>::const_iterator it = a.cbegin();
}

在这里编译:http: //ideone.com/04EE4P

复制构造函数的删除也编译没有错误。这表明您的用户定义的带有non-const引用的复制构造函数导致了问题。

于 2014-09-10T02:48:24.330 回答
0

const_iterator( T *l)应该const_iterator(const T *l)

于 2014-09-10T02:19:26.680 回答