我目前正在创建一组迭代器,它们的实现细节不同,但将用于相同的算法。因此,它们都必须具有相同的接口。为了实现这一点,我创建了一个抽象迭代器类,并在所有进一步的迭代器中从这个类继承。
这应该让您了解我的代码是什么样的:
class INodeIterator
{
public:
virtual ~INodeIterator() {};
virtual bool operator!= (const INodeIterator& other) =0;
virtual bool operator== (const INodeIterator& other) =0;
virtual INodeIterator& operator++ () =0;
virtual INodeIterator& operator++ (int i) =0;
virtual Node& operator* () =0;
};
class NodeIterator : public INodeIterator
{
public:
/* snip */
NodeIterator& operator++ (int i)
{
NodeIterator tmp(*this);
++(*this);
return(tmp);
}
};
现在我面临着与迭代器中的 C++ 后增量运算符重载相同的问题(使用 -Wall -Werror 编译):我的 operator++(int) 实现抛出一个警告(gcc 4.8.0)返回对临时的引用。链接问题中的解决方案是只返回对象而不是引用。
但是,这对我不起作用。如果我同时更改接口和派生类以返回对象而不是引用,则会出现以下错误(摘录、附加文件名等已删除):
INodeIterator.h:16:27: error: invalid abstract return type for member function ‘virtual INodeIterator INodeIterator::operator++(int)’
virtual INodeIterator operator++ (int i) =0;
^
NodeIterator.h:33:22: error: invalid covariant return type for ‘virtual NodeIterator NodeIterator::operator++(int)’
NodeIterator operator++ (int i);
^
INodeIterator.h:16:27: error: overriding ‘virtual INodeIterator INodeIterator::operator++(int)’
virtual INodeIterator operator++ (int i) =0;
^
将派生类上的返回类型更改为 object 而不是抽象类上的预期返回“指定的返回类型冲突”错误。
我怎样才能使这项工作?