Как использовать тип итератора при публичном наследовании от класса контейнера STL? - PullRequest
2 голосов
/ 05 февраля 2012

Я создаю программу, в которой публично наследую свой класс Set от встроенного класса контейнера STL set.Я должен использовать тип итератора при создании некоторых других специализированных функций для моего собственного Set класса, как это определено в классе stl set.

Теперь мой вопрос: какой будет синтаксис для объявленияпеременные типа итератора внутри моих функций-членов?Я пытался:

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

Но компилятор не распознает тип итератора.Пожалуйста, сообщите мне синтаксис для использования типа итератора из класса stl set.

Ответы [ 2 ]

5 голосов
/ 05 февраля 2012

Компилятор жалуется, потому что не знает, что iterator на самом деле является членом set<T>. set<T> - это то, что называется зависимым типом, потому что оно зависит от параметра типа T. В двух словах, компилятор не просматривает зависимые имена при разрешении типов.

Этот раздел часто задаваемых вопросов относится к этому вопросу . Кроме того, обязательно прочитайте ответы на этот вопрос переполнения стека . Чтобы исправить это, используйте typename.

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

Но на самом деле, вы должны использовать композицию вместо наследования для этого случая, например:

template<typename T>
class Set
{
public:
    bool func()
    {
        typename set<T>::iterator it;
        typename set<T>::iterator it2;
    }
private:
    std::set<T> set;
};
0 голосов
/ 05 февраля 2012

Вы никогда не должны когда-либо когда-либо наследовать от класса контейнера STL, потому что деструкторы этих классов не являются виртуальными, и поэтому каждый раз, когда вы создаете экземпляр своего производного класса, вы будете иметьутечка памяти.

Как предложил В одном из своих комментариев Силико, передайте Set переменную-член set вместо ее наследования.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...