Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Общие вопросы > Объявление std::list<T>::iterator


Автор: newgigabyte 27.12.2009, 22:17
Компилятор вываливает ошибку на такой шаблон

Код

template<class T>
class Set{
public:
    void add(T obj){
        if(this->isExist(obj))
            throw (SetErrorExist());
        this->date.push_back(obj);
        this->date.sort();
    }
    T& operator [](unsigned int i){
        if(i>this->date.size()) throw SetErrorNoElement();
        std::list<T>::iterator a=this->date.begin();//Вот тут вываливает
        for(int j=0;j<i;j++) a++;
        return *a;
    }
    unsigned int length(){
        return this->date.size();
    }
    bool isExist(T obj){
        if(std::count(this->date.begin(), this->date.end(), obj)!=0)
            return true;
        else return false;
    }
private:
    std::list<T> date;
};


Компилятор говорит
Код

In file included from main.cpp:10:
set.h:28: error: expected ‘;’ before ‘a’
set.h:29: error: ‘a’ was not declared in this scope
set.h:30: error: ‘a’ was not declared in this scope
set.h: In member function ‘T& Set<T>::operator[](unsigned int) [with T = int]’:
main.cpp:19:   instantiated from here
set.h:28: error: dependent-name ‘std::list::iterator’ is parsed as a non-type, but instantiation yields a type
set.h:28: note: say ‘typename std::list::iterator’ if a type is meant

Автор: jonie 27.12.2009, 22:20
ну он подсказывает же тебе:
Цитата

set.h:28: note: say ‘typename std::list::iterator’ if a type is meant

делай так:
Цитата

        typename std::list<T>::iterator a=this->date.begin();//Вот тут вываливает


просто компилятор не может понять, толи ты обращаешься к типу, толи к статическому полю

Автор: Леопольд 28.12.2009, 09:07
Цитата(newgigabyte @  27.12.2009,  22:17 Найти цитируемый пост)
std::list<T>::iterator

Это называется зависимое имя. Т.е. имя iterator зависит от параметра шаблона T (T в данном случае нечто вроде переменной этапа компиляции, т.е. может принимать разные значения). Шаблоны можно специализировать, а это означает что например, если ты специализировал шаблон list для int (чего делать не стоит, потому что он в std:: ) например таким образом:
Код

namespace std{ //Добаление в std - undefined behavior
   template<class Allocator = allocator<T>>
   class list<int, Allocator>{
   ...
   public:
   ...
      void iterator(){ //В данном случае это не имя типа а имя функции
         ...
      }
   };
}

То компилятор не сможет понять что только для std::list<int>::iterator не является именем класса (типа), поэтому, надо явно указывать typename:

Цитата(jonie @  27.12.2009,  22:20 Найти цитируемый пост)
делай так:
Цитата

        typename std::list<T>::iterator a=this->date.begin();//Вот тут вываливает


просто компилятор не может понять, толи ты обращаешься к типу, толи к статическому полю 


Автор: newgigabyte 28.12.2009, 21:56
Спасибо всем, теперь буду знать=)

Автор: JackYF 29.12.2009, 22:35
newgigabyte, пометь тему решённой.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)