2016-05-22 18 views
-3

当我尝试在抽象类中使用复制 - 交换成语时遇到了一个有趣的错误。下面的代码是专门创建演示这种情况下,如果有什么不正确的,告诉我,但不集中:交换和复制成语不能在抽象类中使用

template <typename T> class iter 
{ 
public: 
    iter(); 
    virtual ~iter(); 
    iter(const iter &); 
    iter(iter &&) noexcept; 
    iter& operator=(iter); 
    virtual void swap(iter &); 

    virtual bool operator!=(const iter&); 
    virtual bool operator==(const iter&); 
    virtual bool operator++() = 0; 
    virtual bool operator--() = 0; 

private: 
    T* pointer; 
}; 

和错误消息是:

iterator.h:10:18: error: cannot declare parameter to be of abstract  type 'iter<T>' 
iter& operator=(iter); 
      ^
iterator.h:3:28: note: because the following virtual functions are pure within 'tier': 
iterator.h:15:15: note:  virtual bool iter<T>::operator++() 
virtual bool operator++() = 0; 
     ^
iterator.h:16:15: note:  virtual bool iter<T>::operator--() 
virtual bool operator--() = 0; 

显然,在这条线导致这个错误,所以我必须在派生类中声明它,而不是在这里,或者有任何其他高级技术?

iter& operator=(iter); 
+0

伙计们:请注意,这是copy-and-swap idiom,所以operaoter =(iter)的重载使用copy而非const引用是故意的。请阅读更多有关复制和交换的内容,否则请不要投票。 –

+0

免责声明不会违反语言的规则,你不能这样做,并且已经有两个很好的答案可以解释原因。 – skypjack

+0

您不能使用抽象类的复制和交换(如本例所示) –

回答

3
iterator.h:10:18: error: cannot declare parameter to be of abstract 
         type 'iter<T>' 
iter& operator=(iter); 

赋值运算符应采取其参数为const引用:

iter &operator=(const iter &); 

的原因编译错误,应该是很明显的:按值传递参数的必要条件是参数必须被复制,这是默认情况下不能用抽象类完成的。在程序中单独

iter& operator=(iter const&); 

不会有/永远不能成为一个iter情况下,将只有推导出实现的抽象函数的类实例:

+0

伙计们:请注意,这是copy-and-swap idiom,所以operaoter =(iter)的重载使用copy而不是const引用。请阅读更多有关复制和交换的内容,否则请不要投票。 –

3

你的赋值操作符必须采取的参考。你不能把它关闭,只做一个抽象基类的副本。

我必须在派生类而不是在这里声明它吗?

听起来像是要走的路。

+0

伙计们:请注意,这是copy-and-swap idiom,所以operaoter =(iter)的重载使用copy而不是const引用。请阅读更多有关复制和交换的内容,否则请不要投票。 –