Модераторы: Daevaorn
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Объявление std::list<T>::iterator 
:(
    Опции темы
newgigabyte
Дата 27.12.2009, 22:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 104
Регистрация: 10.1.2008

Репутация: нет
Всего: 2



Компилятор вываливает ошибку на такой шаблон

Код

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

--------------------
PM MAIL   Вверх
jonie
Дата 27.12.2009, 22:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 5613
Регистрация: 21.8.2005
Где: Владимир

Репутация: 15
Всего: 118



ну он подсказывает же тебе:
Цитата

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

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

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


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


--------------------
Что-то не поняли? -> Напейтесь до зеленых человечков... эта сверхцивилизация Вам поможет...
PM MAIL Jabber   Вверх
Леопольд
Дата 28.12.2009, 09:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 943
Регистрация: 17.6.2009

Репутация: 10
Всего: 13



Цитата(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();//Вот тут вываливает


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



Это сообщение отредактировал(а) Леопольд - 28.12.2009, 09:12


--------------------
вопросов больше чем ответов
PM MAIL   Вверх
newgigabyte
Дата 28.12.2009, 21:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 104
Регистрация: 10.1.2008

Репутация: нет
Всего: 2



Спасибо всем, теперь буду знать=)
--------------------
PM MAIL   Вверх
JackYF
Дата 29.12.2009, 22:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


полуавантюрист
****


Профиль
Группа: Участник
Сообщений: 5814
Регистрация: 28.8.2004
Где: страна тысячи озё р

Репутация: 18
Всего: 162



newgigabyte, пометь тему решённой.


--------------------
Пожаловаться на меня как модератора можно здесь.
PM MAIL Jabber   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.1077 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.