Форум программистов, компьютерный форум CyberForum.ru

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 11, средняя оценка - 5.00
vamfirius
1 / 1 / 0
Регистрация: 16.06.2010
Сообщений: 13
#1

Создание темплейта - C++

13.03.2012, 22:57. Просмотров 1406. Ответов 11
Метки нет (Все метки)

Всем доброго вечера.
Изучаю C++ первый день по книге Страуструпа Special Edition 2011 г.

Проблема возникла на разделе 3.7.1 Контейнер vector

Автором предлагается создание темплейта Vec который выбрасывает эксепшн когда индекс выходит за пределы допустимого диапазона.

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
#include <vector>
using namespace std;
 
template <class T> class Vec: public vector <T>{
public:
    Vec():vector<T>(){}
    Vec(int s):vector<T>(s){}
    T& operator[](int i) {return at(i);}
    const T& operator[](int i) {return at(i);}
};
 
int main() {
    return 0;
}
Этот код выводит следующие ошибки -


hello.cpp:19:11: ошибка: «const T& Vec<T>::operator[](int)» cannot be overloaded
hello.cpp:18:5: ошибка: with «T& Vec<T>::operator[](int)»
hello.cpp: В функции-члене «T& Vec<T>::operator[](int)»:
hello.cpp:18:35: ошибка: «at» не имеет аргументов, зависящих от параметра-шаблона, поэтому должна быть доступна декларация «at» [-fpermissive]
hello.cpp:18:35: замечание: (с ключом «-fpermissive», G++ примет данный код, но разрешение использовать недекларированные имена будет отменено в дальнейших версиях)
hello.cpp: В функции-члене «const T& Vec<T>::operator[](int)»:
hello.cpp:19:41: ошибка: «at» не имеет аргументов, зависящих от параметра-шаблона, поэтому должна быть доступна декларация «at» [-fpermissive]
make: *** [hello.o] Error 1

Работаю на Eclipce Helios CDT(Большая просьба не советовать использовать "Нормальную IDE", я достаточно долгое время работал с php и привык к этой)

Компилятор MinGW

Собственно мой совершенно нубский вопрос заключается в стандартном - почему не работаит)
Дело в том что темплейты обсуждаются значительно дальше в книге а данный код автор использует для всех примеров.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
13.03.2012, 22:57
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Создание темплейта (C++):

Компилятор не может вывести тип для темплейта, передаваемого в вектор - C++
Не работает такая вот конструкция: template&lt;typename T&gt; T getRandomElement(std::vector&lt;T&gt; v) { return v; } getRandom(int a, int b)...

Создать базу данных с(Создание функции БД, Создание процедуры БД, Создание тригера БД) - Программирование Android
В задание для курсовой работы по БД входят вот такие пункты: 1.2 Создание функции БД. 1.3 Создание процедуры БД 1.4 Создание...

Server 2003 Хочу освоить и применить на практике создание локальной сети, создание домена - Windows Server
Доброго времени суток. Господа, на днях начал осваиваю win server 2003. Хочу освоить и применить на практике создание локальной сети,...

Создание кода из строк или создание произвольного количества объектов - Java ME
Привет сообществу. Возник такой вопрос: Мне в мидлете необходимо создать некоторое количество StringItem, заранее неизвестное, то бишь...

Создание БД учет заявок на доступ к информационным ресурсам: создание отчетов - MS Access
Доброго времени суток. Это всего вторая моя попытка что-то наваять в MS Access, сильно не пинайте. Задача: сделать БД по учету...

Создание формулы и последующее заполнение таблицы, избежание повторов информации, создание интерфейса - MS Access
Не люблю просить о помощи, но, к сожалению, сроки поджимают и не позволяют подробно ознакомиться с профессиональной литературой по MS...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
retmas
Жарю без масла
859 / 741 / 164
Регистрация: 13.01.2012
Сообщений: 1,694
13.03.2012, 23:15 #2
Сообщение было отмечено автором темы, экспертом или модератором как ответ
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
template<typename T>
class Vec: public vector<T>
{
    typedef vector<T> base_type;
public:
    typedef typename base_type::reference reference;
    typedef typename base_type::const_reference const_reference;
        
    Vec(): base_type(){}
        
    Vec(int s): base_type(s){}
        
    reference
    operator[](int i) {return base_type::at(i);}
        
    const_reference
    operator[](int i) const {return base_type::at(i);}
};
vamfirius
1 / 1 / 0
Регистрация: 16.06.2010
Сообщений: 13
13.03.2012, 23:31  [ТС] #3
Люди помогите плиз. Почему Страуструп так со мной поступает? =)
Я могу конечно сам забежать вперед и узнать все про темплейты, но это крайне затруднительно учитывая мой уровень знаний в плюсах.

Добавлено через 3 минуты
retmas,

Спасибо за код. А почему антивирусник Avast на него ругается? Я не говорю что вы мне вирус подсовываете, у меня такое уже раньше было с собственным кодом, просто интересно, почему?)

Добавлено через 9 минут
Написал в main() код, антивирусник перестал орать, видимо это связано с тем что main() просто возвращала 0...

retmas, переменные типа Vec создаются, буду продолжать читать Страуструпа, еще раз спасибо за код.
retmas
Жарю без масла
859 / 741 / 164
Регистрация: 13.01.2012
Сообщений: 1,694
13.03.2012, 23:36 #4
vamfirius, либо внимательнее читайте, либо у вас издание с опечатками/неточностями. вряд ли там именно
Цитата Сообщение от vamfirius Посмотреть сообщение
const T& operator[](int i) {return at(i);}
а не
C++
1
const T& operator[](int i) const {return at(i);}
vamfirius
1 / 1 / 0
Регистрация: 16.06.2010
Сообщений: 13
13.03.2012, 23:42  [ТС] #5
retmas,

Вы абсолютно правы, так как я ни строчки не понимаю в этом коде я его просто бездумно набрал с pdf, и const там где вы говорите.

Однако он не компилится даже если поставить const в нужное место.

hello.cpp: В функции-члене «T& Vec<T>::operator[](int)»:
hello.cpp:18:42: ошибка: «at» не имеет аргументов, зависящих от параметра-шаблона, поэтому должна быть доступна декларация «at» [-fpermissive]
hello.cpp:18:42: замечание: (с ключом «-fpermissive», G++ примет данный код, но разрешение использовать недекларированные имена будет отменено в дальнейших версиях)
hello.cpp: В функции-члене «const T& Vec<T>::operator[](int) const»:
hello.cpp:19:54: ошибка: «at» не имеет аргументов, зависящих от параметра-шаблона, поэтому должна быть доступна декларация «at» [-fpermissive]
make: *** [hello.o] Error 1
Mayonez
14.03.2012, 00:20
  #6

Не по теме:

Цитата Сообщение от vamfirius Посмотреть сообщение
А почему антивирусник Avast на него ругается?
меня тоже раздражает, когда аваст на совсем безобидную прогу выдает ТРЕВОГА!!!!

Питекантроп
246 / 140 / 6
Регистрация: 14.06.2010
Сообщений: 340
14.03.2012, 12:33 #7
Цитата Сообщение от vamfirius Посмотреть сообщение
Однако он не компилится даже если поставить const в нужное место.
Вроде все компилится
C++
1
2
3
4
5
6
7
8
9
10
template<typename T>
class Vec: public vector<T>
{
    typedef vector<T> base_type;
public:
    Vec() : base_type(){}
    Vec(int s) : base_type(s){}
    T & operator[](int i) {return base_type::at(i);}
    const T & operator[](int i) const {return base_type::at(i);}
};
vamfirius
1 / 1 / 0
Регистрация: 16.06.2010
Сообщений: 13
14.03.2012, 12:36  [ТС] #8
Питекантроп,

Код написанный retmas, компилится и работает нормально, я говорю о примере который дан в книге, или это вообще псевдокод?
silent_1991
Эксперт С++
4963 / 3039 / 149
Регистрация: 11.11.2009
Сообщений: 7,027
Завершенные тесты: 1
14.03.2012, 12:46 #9
Сообщение было отмечено автором темы, экспертом или модератором как ответ
Цитата Сообщение от vamfirius Посмотреть сообщение
или это вообще псевдокод
Нет, скорее всего, в книге просто опечатка. Подобная тема уже была, возможно, речь там шла о той же книге. Там тоже был пропущен const.
vamfirius
1 / 1 / 0
Регистрация: 16.06.2010
Сообщений: 13
14.03.2012, 13:14  [ТС] #10
silent_1991,

Нет вы не поняли, пропущенный const - моя опечатка. В книге вот такой код

C++
1
2
3
4
5
6
7
template <class T> class Vec: public vector <T>{
public:
        Vec():vector<T>(){}
        Vec(int s):vector<T>(s){}
        T& operator[](int i) {return at(i);}
        const T& operator[](int i) const {return at(i);}
};
Вот он не компилится с такими ошибками -

hello.cpp: В функции-члене «T& Vec<T>::operator[](int)»:
hello.cpp:18:42: ошибка: «at» не имеет аргументов, зависящих от параметра-шаблона, поэтому должна быть доступна декларация «at» [-fpermissive]
hello.cpp:18:42: замечание: (с ключом «-fpermissive», G++ примет данный код, но разрешение использовать недекларированные имена будет отменено в дальнейших версиях)
hello.cpp: В функции-члене «const T& Vec<T>::operator[](int) const»:
hello.cpp:19:54: ошибка: «at» не имеет аргументов, зависящих от параметра-шаблона, поэтому должна быть доступна декларация «at» [-fpermissive]
make: *** [hello.o] Error 1

Мне кажется странным что автор языка мог отправить в публикацию неработающий код на котором к тому же строится куча примеров, возможно дело в компиляторе...
fasked
Эксперт С++
4934 / 2514 / 180
Регистрация: 07.10.2009
Сообщений: 4,311
Записей в блоге: 1
14.03.2012, 13:32 #11
vamfirius, странно, конечно, что так...
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
template <class T> class Vec : public std::vector<T>
{
public:
   Vec() : std::vector<T>()
   {
   }
   
   Vec(int s) : std::vector<T>(s)
   {
   }
   
   T& operator[](int i) 
   {
      return std::vector<T>::at(i);
   }
   
   const T& operator[](int i) const 
   {
      return std::vector<T>::at(i);
   }
};
retmas
Жарю без масла
859 / 741 / 164
Регистрация: 13.01.2012
Сообщений: 1,694
14.03.2012, 16:36 #12
Цитата Сообщение от vamfirius Посмотреть сообщение
Мне кажется странным что автор языка мог отправить в публикацию неработающий код на котором к тому же строится куча примеров, возможно дело в компиляторе...
с компилятором все ок. боле того, он сделал так, как должен был.
а насчёт неработающего кода в публикации... все мы люди.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
14.03.2012, 16:36
Привет! Вот еще темы с ответами:

Создание базы данных на лету, создание и заполнение таблиц в базе DB (Paradox? или..). - C#
Здравствуйте Профи! --- Видел я &quot;простенькую&quot; (exe-шник небольшого размера, запускается сразу, без предварительной установки)...

Создание источника данных, создание серверных страниц и выбор WEB-сервера и его установка - Web
на практике попросили сделать задание. 1)Создание источника данных 2)Создание серверных страниц 3)Выбор WEB-сервера и его установка ...

Создание экземпляра БД (создание собственно базы данных) - Oracle
Добрый день. Подскажите пожалуйста, я пытаюсь установить Oracle Database 11g Release 2. Следую этой инструкцией...

Файлы. Создание и размещение небольшого текста, создание двух дочерних процессов, вывод результи- рующего файла на экран - C Linux
Помогите пожалуйста с программой. Разработайте программу, выполняющую: 1) создание файла и размещение в нем небольшого текста; 2)...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
14.03.2012, 16:36
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru