我正在开发一个必须使用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();
}
// -------------------------------------------------------------
答案 0 :(得分:4)
在Object.assign
函数中,method
引用常量对象。这意味着您只能调用标记为layer
的函数。比如说。
const
答案 1 :(得分:0)
您的函数接受const AbstractLayer
,这意味着只能调用const
个成员函数。但是,begin
和begin2
不是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
答案 2 :(得分:0)
您不需要begin
和begin2
。你需要的是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
。