我正在制作一个程序,我从内置的STL容器类Set
公开继承我的set
类。我必须使用迭代器类型,同时为我自己的Set
类创建一些其他专用函数,如stl
集合类中所定义。
现在我的问题是:在我的成员函数中声明迭代器类型变量的语法是什么?我一直在努力:
template<typename T>
class Set : public set<T> {
public:
bool func()
{
iterator it,it2;
}
};
但是编译器没有识别迭代器类型。请告诉我使用stl set
类中的迭代器类型的语法。
答案 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
而不是继承它。