获取const引用的迭代器

时间:2016-03-10 14:51:37

标签: c++ stl

我正在开发一个必须使用begin()方法返回迭代器的类。另外,我必须开发一个函数来接收这个类的const引用并迭代它。

当我尝试从此方法获取迭代器时,我遇到以下编译错误:"the object has type qualifiers that are not compatible with the member function."我无法理解为什么会出现此错误。

这是我写的代码:

// ------------ class Neuron -------------
class Neuron { ... };
// ---------------------------------


// ------------ class AbstractLayer -------------
class AbstractLayer {
public:

    class Iterator : public std::iterator<std::input_iterator_tag, Neuron> {
        public:
            Iterator(Neuron *neurons) : _neurons(neurons) {}
        private:
            Neuron *_neurons;
    };

    virtual Iterator begin() = 0;
    virtual const Iterator begin2() = 0;
};
// ----------------------------------------


// ------------ class Layer -------------
class Layer : AbstractLayer {

public:
    Layer(){};
    Iterator begin(){ return Iterator(_neurons); }
    const Iterator begin2(){ return (const Iterator)begin(); }

private:
    Neuron *_neurons;
    int _size;
};
// --------------------------------


// ------------ Method where the problem is -------------------
void method(const AbstractLayer &layer){
    // Error in both methods: 
    // "the object has type qualifiers that are not compatible with the member function."
    layer.begin();
    layer.begin2();
}
// -------------------------------------------------------------

4 个答案:

答案 0 :(得分:4)

Object.assign函数中,method引用常量对象。这意味着您只能调用标记为layer的函数。比如说。

const

答案 1 :(得分:0)

您的函数接受const AbstractLayer,这意味着只能调用const个成员函数。但是,beginbegin2不是const。事实上,假设只有begin2返回const Iterator,那么尝试在此方法中调用begin是没有意义的。

更改

virtual const Iterator begin2() = 0;

virtual const Iterator begin2() const = 0;

const Iterator begin2()

const Iterator begin2() const

最后,返回const Iterator在您的代码中实际上毫无意义,因为const因返回的右值而被丢弃。无论如何,当您致电const Iterator时,您不需要向begin执行投射;只返回一个Iterator,编译器会注意使它成为const。

最后,您的Layer课程需要从AbstractLayer公开派生:

class Layer : public AbstractLayer

Live Demo

答案 2 :(得分:0)

您不需要beginbegin2。你需要的是begin的两个版本 - const和非const。 const one会返回const迭代器。您还可能需要cbegin(仅限const),它始终返回const迭代器。

答案 3 :(得分:0)

method中,layer参数是const,它阻止您在其上调用非const方法。如果通过非const引用(void method(AbstractLayer &layer))获取图层,则可以调用这两种方法。

您应该提供一个返回begin的const const_iterator方法,以便您可以迭代const AbstractLayer