关于模板继承

时间:2014-04-03 17:07:24

标签: c++ templates inheritance

我有以下课程: // concreteIterator.h

template<class Item>
    class concreteForwardItr : public iterator<Item>
{

public:
    concreteForwardItr(){}
    concreteForwardItr( List<Item> *theList){
      //  this->iterator();
        targetList = theList;
        currentPos = 0;
    }

  void first(){
        currentPos = 0;
    }

   Item CurrentItem() const {
    // return targetList->
     if(!IsDone())
     {
        return targetList->get(currentPos);
     }

  private:
    List<Item>* targetList;

    //keep track of current position
    long currentPos;
}

//iterator.h
template <class Item>
class iterator{
public:
    virtual void first() =0;
     virtual Item CurrentItem()  = 0;
}

但编译器抱怨:未定义引用&#39; iterator :: iterator()&#39;

但我甚至不打电话给那个功能。我知道编译器会为列表类生成一个默认值。有谁看到问题是什么?

1 个答案:

答案 0 :(得分:2)

首先,让我们按正确的顺序排列:

template <class Item>
class iterator{
public:
    virtual void first() = 0;
    virtual Item CurrentItem()  = 0;
}


template<class Item>
    class concreteForwardItr : public iterator<Item>
{

public:
    concreteForwardItr(){}
    concreteForwardItr( List<Item> *theList){
      //  this->iterator();
        targetList = theList;
        currentPos = 0;
    }

  void first(){
        currentPos = 0;
    }

   Item CurrentItem() const {
    // return targetList->
     if(!IsDone()) // what is `IsDone`?
     {
        return targetList->get(currentPos);
     }
   // where's the closing brace?

  private:
    List<Item>* targetList;

    //keep track of current position
    long currentPos;
}

一个问题是concreteForwardItr::CurrentItem没有覆盖iterator::CurrentItem,因为前者是const而后者不是override。你应该总是使用&#34;关键字&#34; {1}当你想要覆盖虚函数时(如果你的编译器支持它):

Item CurrentItem() const override
{ /* ... */ }

这会产生错误的编译器错误:函数不会覆盖任何基类虚函数

要使concreteForwardItr::CurrentItem覆盖iterator::CurrentItem,请调整其中任何一个的const限定。你应该调整哪一个是设计决策;如果接口声明该成员函数为const,则实现不能改变它。

我在第一个代码块中评论了另外两个可能的问题。请注意,在源文件(.cpp)中,类模板iterator应该出现在concreteForwardItr之前(&#34;正确的顺序&#34;)。


您可能需要考虑重命名此类,因为它符合范围的C ++概念,而不是C ++ 迭代器的概念。

虚函数通常具有运行时开销,迭代器/范围通常用于循环。这可能是标准库(和增强范围IIRC)不为其自己的迭代器/范围类使用类层次结构设计的原因之一,而是无关的类实现了一些抽象概念,并结合了通用算法。算法也与迭代器的类设计分离,它们只需要这个概念。