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

C++ 如何在模板类的内部类中编写虚函数?,c++,templates,inner-classes,virtual-functions,C++,Templates,Inner Classes,Virtual Functions,我有一个内部类,myIterator,属于我的模板类linearLinkedList,我想覆盖从simpleIterator继承的虚拟方法,但编译器拒绝了它们,因为“模板可能不是虚拟的”。尽管如此,基于这似乎是可能的,因为它只取决于类的类型。例如,下面我的代码中的方法foo是合法的。如何实现内部类的虚拟函数 template <class T> class linearLinkedList { public: ... virtual void foo(T data); //OK si

我有一个内部类,
myIterator
,属于我的模板类
linearLinkedList
,我想覆盖从
simpleIterator
继承的虚拟方法,但编译器拒绝了它们,因为“模板可能不是虚拟的”。尽管如此,基于这似乎是可能的,因为它只取决于类的类型。例如,下面我的代码中的方法
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()
模板
类线性链接列表
{
公众:
...
虚拟void foo(T数据);//确定
simpleIterator*迭代器();
私人:
...
类myIterator:公共simpleIterator
{
公众:
myIterator(节点**头);
virtual~myIterator();//继承自simpleIterator;实现时出错
私人:
节点**prev;
节点**下一步;
//从simpleIterator继承的函数:
虚拟bool hasNext_impl();//实现时出错
虚拟T next_impl();
虚拟void remove_impl();
};
...
模板
虚拟线性链接列表::myIterator::~myIterator(){…}
->
linearLinkedList.h:213:1:error:模板可能不是虚拟的
虚拟线性链接列表::myIterator::~myIterator()

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

§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
模板
虚拟线性链接列表::myIterator::~myIterator(){…}
要删除的~~~~~~^

不要在类外定义中添加
virtual
关键字。你不能在类外定义中使用virtual关键字。@PiotrSkotnicki哦,我真傻。想把这个答案作为我可以接受的答案吗?