从STL容器类公开继承时,如何使用迭代器类型?

时间:2012-02-05 05:06:13

标签: c++ stl iterator

我正在制作一个程序,我从内置的STL容器类Set公开继承我的set类。我必须使用迭代器类型,同时为我自己的Set类创建一些其他专用函数,如stl集合类中所定义。

现在我的问题是:在我的成员函数中声明迭代器类型变量的语法是什么?我一直在努力:

  template<typename T>
  class Set : public set<T> {
         public:
         bool func()
         {
            iterator it,it2;
         }
   };

但是编译器没有识别迭代器类型。请告诉我使用stl set类中的迭代器类型的语法。

2 个答案:

答案 0 :(得分:5)

编译器抱怨,因为它不知道iterator实际上是set<T>的成员。 set<T>是所谓的依赖类型,因为它取决于类型参数T。简而言之,编译器在解析类型时不会查看依赖名称。

This FAQ entry is relevant to this question。另外,请务必仔细阅读the answers to this Stack Overflow question。要解决此问题,请使用typename

template<typename T> 
class Set : public set<T> { 
public: 
    bool func() 
    { 
        typename set<T>::iterator it;
        typename set<T>::iterator it2; 
    } 
}; 

但实际上,对于这种情况你应该是using composition instead of inheritnace,如下所示:

template<typename T>
class Set
{
public:
    bool func()
    {
        typename set<T>::iterator it;
        typename set<T>::iterator it2;
    }
private:
    std::set<T> set;
};

答案 1 :(得分:0)

你永远不应该永远从STL容器类继承,因为这些类的析构函数不是虚拟的,因此每次实例化派生类的实例时,你都会有内存泄漏。

正如Silico在其中一条评论中所建议的那样,给Set成员变量set而不是继承它。