如何在模板类的内部类中编写虚函数?

时间:2015-10-14 07:08:49

标签: c++ templates inner-classes virtual-functions

我有一个内部类myIterator,我的模板类linearLinkedList<T>,我想从simpleIterator<T>覆盖继承的虚方法,但编译器拒绝它们因为&#34;模板可能不是虚拟的。&#34;但是,基于this question,似乎这应该是可能的,因为它只取决于类的类型。例如,我的代码中的方法foo是合法的。如何实现内部类的虚函数?

template <class T>
class linearLinkedList
{
public:
...
virtual void foo(T data); //OK
simpleIterator<T> * iterator();
private:
...
class myIterator : public simpleIterator<T>
{
  public:
    myIterator(node<T> ** head);
    virtual ~myIterator(); //inherited from simpleIterator; error when implemented
  private:
    node<T> ** prev;
    node<T> ** next;
    //functions inherited from simpleIterator<T>:
    virtual bool hasNext_impl(); //error when implemented
    virtual T next_impl();
    virtual void remove_impl();
};
...
template<class T>
virtual linearLinkedList<T>::myIterator::~myIterator() { ... }
->
linearLinkedList.h:213:1: error: templates may not be âvirtualâ
virtual linearLinkedList<T>::myIterator::~myIterator()

1 个答案:

答案 0 :(得分:3)

不是函数模板本身的成员函数可以标记为virtual,即使它是类模板的一部分,但是:

§7.1.2[dcl.fct.spec] / p1:

  

函数说明符只能在函数声明中使用。

function-specifier:
    inline
    virtual
    explicit
     

virtual说明符必须仅用于非静态类成员函数的初始声明;见10.3。

也就是说,您应该从类外定义中删除virtual关键字:

template<class T>
virtual linearLinkedList<T>::myIterator::~myIterator() { ... }
~~~~~~^ to be removed