![](/img/trans.png)
[英]How to define the type of a member of an iterator class to work with STL container methods?
[英]How do I use the iterator type when inheriting publicly from an STL container class?
我正在編寫一個程序,在該程序中我從內置STL容器類set
公開繼承了Set
類。 我必須使用迭代器類型,同時為自己的Set
類(在stl
set類中定義)創建一些其他專用功能。
現在我的問題是:在成員函數中聲明迭代器類型的變量的語法是什么? 我已經試了:
template<typename T>
class Set : public set<T> {
public:
bool func()
{
iterator it,it2;
}
};
但是編譯器無法識別迭代器類型。 請告訴我使用stl set
類中的迭代器類型的語法。
編譯器抱怨是因為它不知道iterator
實際上是set<T>
的成員。 set<T>
是所謂的從屬類型,因為它取決於類型參數T
簡而言之,編譯器在解析類型時不會在內部依賴名稱中查找。
此常見問題解答條目與此問題有關 。 另外,請務必通讀此Stack Overflow問題的答案 。 要修復它,請使用typename
。
template<typename T>
class Set : public set<T> {
public:
bool func()
{
typename set<T>::iterator it;
typename set<T>::iterator it2;
}
};
但實際上,在這種情況下,您應該使用composition而不是heritageace ,例如:
template<typename T>
class Set
{
public:
bool func()
{
typename set<T>::iterator it;
typename set<T>::iterator it2;
}
private:
std::set<T> set;
};
從不應該從STL容器類繼承任何東西,因為這些類的析構函數不是虛擬的,因此,每次實例化派生類的實例時,都會發生內存泄漏。
正如In Silico在其評論中建議的那樣,請給Set
一個成員變量set
而不要繼承它。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.