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

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

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 11, средняя оценка - 5.00
vamfirius
1 / 1 / 0
Регистрация: 16.06.2010
Сообщений: 13
13.03.2012, 22:57     Создание темплейта #1
Всем доброго вечера.
Изучаю 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++

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

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
retmas
Жарю без масла
803 / 685 / 143
Регистрация: 13.01.2012
Сообщений: 1,580
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
Жарю без масла
803 / 685 / 143
Регистрация: 13.01.2012
Сообщений: 1,580
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
Эксперт C++
4938 / 3014 / 149
Регистрация: 11.11.2009
Сообщений: 7,024
Завершенные тесты: 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
Эксперт C++
 Аватар для fasked
4924 / 2504 / 180
Регистрация: 07.10.2009
Сообщений: 4,306
Записей в блоге: 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
Жарю без масла
803 / 685 / 143
Регистрация: 13.01.2012
Сообщений: 1,580
14.03.2012, 16:36     Создание темплейта #12
Цитата Сообщение от vamfirius Посмотреть сообщение
Мне кажется странным что автор языка мог отправить в публикацию неработающий код на котором к тому же строится куча примеров, возможно дело в компиляторе...
с компилятором все ок. боле того, он сделал так, как должен был.
а насчёт неработающего кода в публикации... все мы люди.
Yandex
Объявления
14.03.2012, 16:36     Создание темплейта
Ответ Создать тему
Опции темы

Текущее время: 09:27. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru