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

allocator, при компиляции ошибка - C++

Восстановить пароль Регистрация
 
karl 777
0 / 0 / 0
Регистрация: 29.06.2013
Сообщений: 58
06.08.2013, 08:43     allocator, при компиляции ошибка #1
C++
1
2
3
4
5
6
7
8
9
template<class T> 
class Vec
{ 
public:
...
private:
allocator<T> alloc;
...
}
При компиляции выдает ошибки C4430, C2238 и C2143 и каждая указывает на строку allocator<t> alloc;
В чем может быть ошибка?
Миниатюры
allocator, при компиляции ошибка  
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
06.08.2013, 08:43     allocator, при компиляции ошибка
Посмотрите здесь:

Ошибка при компиляции C++
C++ Ошибка при компиляции
Ошибка при компиляции C++
Ошибка при компиляции C++
C++ Ошибка при компиляции
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Wolkodav
 Аватар для Wolkodav
599 / 452 / 32
Регистрация: 18.09.2012
Сообщений: 1,685
06.08.2013, 09:14     allocator, при компиляции ошибка #2
karl 777, скиньте весь код, кажется вы забыл где-то точку с запятой)

Добавлено через 59 секунд
Цитата Сообщение от karl 777 Посмотреть сообщение
template<class T>
class Vec
{
public:
...
private:
allocator<T> alloc;
...
};
в последней строчке она нужна
karl 777
0 / 0 / 0
Регистрация: 29.06.2013
Сообщений: 58
06.08.2013, 09:28  [ТС]     allocator, при компиляции ошибка #3
Пунктуацию я всю проверил, все на месте и template также закрывает.
Если убрать строку с аллокатором, то компилятор не выводит ошибки, что это такое?
Wolkodav
 Аватар для Wolkodav
599 / 452 / 32
Регистрация: 18.09.2012
Сообщений: 1,685
06.08.2013, 09:30     allocator, при компиляции ошибка #4
Глуппо но вместо class вставьте typename

Добавлено через 15 секунд
В template
karl 777
0 / 0 / 0
Регистрация: 29.06.2013
Сообщений: 58
06.08.2013, 09:34  [ТС]     allocator, при компиляции ошибка #5
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
    template<class T>
    class Vec
    {
    public:
        typedef T* iterator;
        typedef const T* const_iterator;
        typedef size_t size_type;
        typedef T value_type;
        typedef T& reference;
        typedef const T& const_reference;
 
         Vec()                                                                  // Конструктор, который говорит, что вектор пустой
         {
            create();
         }
         explicit Vec(size_type n, const T& val=T())                            // Конструктор, который веделяет память на n объектов типа T
         {
             create(n, val);
         }
 
         size_type size() const                                                 // Функция определяющая размер вектора
         {
             return avail-data;
         }
 
         T& operator[](size_type i)                                             // Доступ к i-ому элементу
         {
             return data[i];
         }
         const T& operator[](size_type i) const
         {
             return data[i];
         }
 
         iterator begin()                                                       // Возвращает итератор на начало вектора
         {
             return data;
         }
         const_iterator begin() const
         {
             return data;
         }
         iterator end()                                                         // Возвращает итератор на конец вектора
         {
             return avail;
         }
         const_iterator end() const
         {
             return avail;
         }
 
         Vec(const Vec& v)                                                      // Конструктор копирования       
         {
             create(v.begin(), v.end());
         }
 
         Vec& operator=(const Vec&);                                            // Конструктор присваивания
 
         ~Vec()                                                                 // Деструктор для разрушения вектора
         {
             uncreate();                                                    
         }
 
         void push_back(const T& t)
         {
             if(avail==limit)
                 grow();
             unchecked_append(t);
         }
 
    private:
        iterator data;                                                          // Начало инициализированых элементов
        iterator avail;                                                         // Конец инициализированых элементов и начало неицилизированых
        iterator limit;                                                         // Конец неинициализированых элементов
        
        allocator<T> alloc;                                                     // Объект, управляющий выделением памяти
 
        // Средства размещения в памяти базового массива и его инициализации
        void create();                                                          // Создает пустой vector - объект
        void create(size_type, const T&);                                       // Выделяет кол-во памяти и инициализирует эти элементы
        void create(const_iterator, const_iterator);                            // Работает как две предыдущие
 
        // Средства разрушения элементов массива и освобождения памяти
        void uncreate();
 
        // Вспомогающие процедуры для push_back
        void grow();                                                            // Выделение памяти для хранения хотя бы еще одного элемента
        void unchecked_append(const T&);                                        // Создает элемент в первой ячейки памяти расположенной за уже созданной
    };
 
//------------------------------------
 
    template <class T>                                                          // Cоздаем пустой вектор
    void Vec<T>::create()
    {
        data=avail=limit=0;                                     // Вектор пуст
    }
 
//------------------------------------
 
    template <class T> 
    void Vec<T>::create(size_type n, const T& val)                              // Выделяет памяти на n элементов типа val
    {
        data=alloc.llocate(n);                                  // Выделяется кол-во памяти для хранения n элементов
        limit=avail=data+n;
        uninitialized_fill(data, limit, val);                   // Инициализация всех элементов вектора длинною n
    }
 
//-------------------------------------
 
    template <class T> 
    void Vec<T>::create(const_iterator i, const_iterator j)                     // Выделение памяти и инициализация элементов
    {
        data=alloc.allocate(j-i);                               // Выделяет кол-во памяти для хранения j-i элементов 
        limit=avail=uninitialized_copy(i, j, data);             // Инициализация элементов с i по j(посредством копирования), возвращает итератор на элемент за j
    }
 
//-------------------------------------
 
    template <class T> 
    void Vec<T>::uncreate()                                                     // Уничтожает последствия работы функция create
    {
        if (data)
        {
            iterator it=limit;
            while(it!=data)
                alloc.destroy(--it);                            // Разрушаем каждый элемент по очереди
            alloc.deallocate(data, limit-data);                 // Освобождаем всю занятую ранее память
        }
        data=avail=limit=0;                                     // Говорим о том, что вектор пуст
    }
 
//--------------------------------------
 
    template <class T> 
    void Vec<T>::grow()                                                         // Выделение памяти для последуещего элемента
    {
        size_type new_size=max(2*(limit-data), ptrdiff_t(1));   // При увеличении объекта выделяемой области памяти, вдвое большую используемой в данный момент
                                                                // ptrdiff_t(1) - имеет тот же тип, что и limit-data
 
        iterator new_data=alloc.allocate(new_size);             // Веделяем память для хранения new_size элементов
        iterator new_avail=uninitialized_copy(data, avail, new_data); // Инициализация элементов
 
        uncreate();                                             // Освобождаем память
 
        // Переводим указатели на новое место
        data=new_data;
        avail=new_avail;
        limit=data+new_size;
    }
 
//---------------------------------------------
 
    template <class T> 
    void Vec<T>::unchecked_append(const T& val)                                 // Создание элемента в первой ячейке памяти за уже существующей
    {
        allос.construct(avail++, val);                          // Создание элемента на место avail++ типа val
    }
Wolkodav
 Аватар для Wolkodav
599 / 452 / 32
Регистрация: 18.09.2012
Сообщений: 1,685
06.08.2013, 09:40     allocator, при компиляции ошибка #6
karl 777,
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
 template<typename T>
    class Vec
    {
    public:
        typedef T* iterator;
        typedef const T* const_iterator;
        typedef size_t size_type;
        typedef T value_type;
        typedef T& reference;
        typedef const T& const_reference;
 
         Vec()                                                                  // Конструктор, который говорит, что вектор пустой
         {
            create();
         }
         explicit Vec(size_type n, const T& val=T())                            // Конструктор, который веделяет память на n объектов типа T
         {
             create(n, val);
         }
 
         size_type size() const                                                 // Функция определяющая размер вектора
         {
             return avail-data;
         }
 
         T& operator[](size_type i)                                             // Доступ к i-ому элементу
         {
             return data[i];
         }
         const T& operator[](size_type i) const
         {
             return data[i];
         }
 
         iterator begin()                                                       // Возвращает итератор на начало вектора
         {
             return data;
         }
         const_iterator begin() const
         {
             return data;
         }
         iterator end()                                                         // Возвращает итератор на конец вектора
         {
             return avail;
         }
         const_iterator end() const
         {
             return avail;
         }
 
         Vec(const Vec& v)                                                      // Конструктор копирования       
         {
             create(v.begin(), v.end());
         }
 
         Vec& operator=(const Vec&);                                            // Конструктор присваивания
 
         ~Vec()                                                                 // Деструктор для разрушения вектора
         {
             uncreate();                                                    
         }
 
         void push_back(const T& t)
         {
             if(avail==limit)
                 grow();
             unchecked_append(t);
         }
 
    private:
        iterator data;                                                          // Начало инициализированых элементов
        iterator avail;                                                         // Конец инициализированых элементов и начало неицилизированых
        iterator limit;                                                         // Конец неинициализированых элементов
        
        allocator<T> alloc;                                                     // Объект, управляющий выделением памяти
 
        // Средства размещения в памяти базового массива и его инициализации
        void create();                                                          // Создает пустой vector - объект
        void create(size_type, const T&);                                       // Выделяет кол-во памяти и инициализирует эти элементы
        void create(const_iterator, const_iterator);                            // Работает как две предыдущие
 
        // Средства разрушения элементов массива и освобождения памяти
        void uncreate();
 
        // Вспомогающие процедуры для push_back
        void grow();                                                            // Выделение памяти для хранения хотя бы еще одного элемента
        void unchecked_append(const T&);                                        // Создает элемент в первой ячейки памяти расположенной за уже созданной
    };
 
//------------------------------------
 
    template <class T>                                                          // Cоздаем пустой вектор
    void Vec<T>::create()
    {
        data=avail=limit=0;                                     // Вектор пуст
    }
 
//------------------------------------
 
    template <class T> 
    void Vec<T>::create(size_type n, const T& val)                              // Выделяет памяти на n элементов типа val
    {
        data=alloc.llocate(n);                                  // Выделяется кол-во памяти для хранения n элементов
        limit=avail=data+n;
        uninitialized_fill(data, limit, val);                   // Инициализация всех элементов вектора длинною n
    }
 
//-------------------------------------
 
    template <class T> 
    void Vec<T>::create(const_iterator i, const_iterator j)                     // Выделение памяти и инициализация элементов
    {
        data=alloc.allocate(j-i);                               // Выделяет кол-во памяти для хранения j-i элементов 
        limit=avail=uninitialized_copy(i, j, data);             // Инициализация элементов с i по j(посредством копирования), возвращает итератор на элемент за j
    }
 
//-------------------------------------
 
    template <class T> 
    void Vec<T>::uncreate()                                                     // Уничтожает последствия работы функция create
    {
        if (data)
        {
            iterator it=limit;
            while(it!=data)
                alloc.destroy(--it);                            // Разрушаем каждый элемент по очереди
            alloc.deallocate(data, limit-data);                 // Освобождаем всю занятую ранее память
        }
        data=avail=limit=0;                                     // Говорим о том, что вектор пуст
    }
 
//--------------------------------------
 
    template <class T> 
    void Vec<T>::grow()                                                         // Выделение памяти для последуещего элемента
    {
        size_type new_size=max(2*(limit-data), ptrdiff_t(1));   // При увеличении объекта выделяемой области памяти, вдвое большую используемой в данный момент
                                                                // ptrdiff_t(1) - имеет тот же тип, что и limit-data
 
        iterator new_data=alloc.allocate(new_size);             // Веделяем память для хранения new_size элементов
        iterator new_avail=uninitialized_copy(data, avail, new_data); // Инициализация элементов
 
        uncreate();                                             // Освобождаем память
 
        // Переводим указатели на новое место
        data=new_data;
        avail=new_avail;
        limit=data+new_size;
    }
 
//---------------------------------------------
 
    template <class T> 
    void Vec<T>::unchecked_append(const T& val)                                 // Создание элемента в первой ячейке памяти за уже существующей
    {
        allос.construct(avail++, val);                          // Создание элемента на место avail++ типа val
    }
Попробуйте.
karl 777
0 / 0 / 0
Регистрация: 29.06.2013
Сообщений: 58
06.08.2013, 09:59  [ТС]     allocator, при компиляции ошибка #7
Все равно выводит те же ошибки.
gray_fox
What a waste!
 Аватар для gray_fox
1244 / 1127 / 53
Регистрация: 21.04.2012
Сообщений: 2,350
Завершенные тесты: 3
06.08.2013, 10:19     allocator, при компиляции ошибка #8
Инклюды нужные на месте?
C++
1
2
3
#include <memory>
 
std::allocator<T> alloc;
Toshkarik
 Аватар для Toshkarik
1139 / 856 / 51
Регистрация: 03.08.2011
Сообщений: 2,381
Завершенные тесты: 1
06.08.2013, 10:22     allocator, при компиляции ошибка #9
А заголовок memory включЕн в файл?

PS: опоздал чутка xD
karl 777
0 / 0 / 0
Регистрация: 29.06.2013
Сообщений: 58
06.08.2013, 10:22  [ТС]     allocator, при компиляции ошибка #10
Спасибо, прописал <memory>.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
06.08.2013, 10:23     allocator, при компиляции ошибка
Еще ссылки по теме:

C++ Распределитель памяти идентичный std::allocator. Непонятные синтаксис и концепция std::allocator::construct
Ошибка при компиляции C++
Ошибка при компиляции C++

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

Или воспользуйтесь поиском по форуму:
Wolkodav
 Аватар для Wolkodav
599 / 452 / 32
Регистрация: 18.09.2012
Сообщений: 1,685
06.08.2013, 10:23     allocator, при компиляции ошибка #11
Блин, даже не думал в эту сторону...
Yandex
Объявления
06.08.2013, 10:23     allocator, при компиляции ошибка
Ответ Создать тему
Опции темы

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