簡體   English   中英

從STL容器類公開繼承時,如何使用迭代器類型?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM