Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 5.00/3: Рейтинг темы: голосов - 3, средняя оценка - 5.00
1 / 1 / 1
Регистрация: 02.03.2013
Сообщений: 169
1

Ошибка при использовании std::allocator

26.05.2019, 14:59. Показов 503. Ответов 9

Пытаюсь разобраться с использование std::allocator.
Вот пример кода:
Кликните здесь для просмотра всего текста
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
template <typename T, typename A>
struct vector_base
{
  A       allocator;
  T*      data;
  size_t  size;
  size_t  space;
 
  vector_base(const A &alloc, size_t n)
    :allocator(alloc), data(alloc.allocate(n)), size(n), space(n)
  {}
 
  ~vector_base() {allocator.deallocate(data, space);}
};
 
int main() {
  std::allocator<int> myAllocator;
  vector_base<int, std::allocator<int>> vector(myAllocator, 10);
  
  return 0;
}


Компилятор выдаёт следующую ошибку:
Код
error: passing ‘const std::allocator<int>’ as ‘this’ argument discards qualifiers [-fpermissive]
     :allocator(alloc), data(alloc.allocate(n)), size(n), space(n)
Что этот значит, и как это можно это исправить?
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
26.05.2019, 14:59
Ответы с готовыми решениями:

Распределитель памяти идентичный std::allocator. Непонятные синтаксис и концепция std::allocator::construct
Компилятор: MSVC 2010 Exress код моего класса распределяющего память под спойлером #include...

Выдается ошибка в std при использовании оператора for
Написал программу с использованием оператора for на С++. Вот код: # include &lt;iosteam&gt; int main...

В чем ошибка при использовании std::threads
Добрый день! Упражняюсь в std::threads, написал вот такую-вот программку. Выдает ошибку: error...

Ошибка при использовании erase для std::vector
Почему в случае удаления элемента из вектора с помощью передачи итератора в erase, который...

__________________

Записывайтесь на профессиональные курсы C++ разработчиков
9
14095 / 7564 / 1794
Регистрация: 30.01.2014
Сообщений: 12,660
26.05.2019, 17:28 2
Цитата Сообщение от schoolboy_ Посмотреть сообщение
Что этот значит
Это значит, что функция allocate неконстантная, а вызываете вы ее у объекта по константной ссылке.

Цитата Сообщение от schoolboy_ Посмотреть сообщение
как это можно это исправить?
C++
1
2
3
  vector_base(const A &alloc, size_t n)
    :allocator(alloc), data(allocator.allocate(n)), size(n), space(n)
  {}
1
Mental handicap
1243 / 621 / 171
Регистрация: 24.11.2015
Сообщений: 2,426
26.05.2019, 17:37 3
Цитата Сообщение от schoolboy_ Посмотреть сообщение
Что этот значит, и как это можно это исправить?
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
template <typename T, typename A = allocator<T>>
struct vector_base
{
  A       allocator;
  T*      data;
  size_t  size;
  size_t  space;
 
  vector_base(A const& alloc, size_t n)
    :allocator(alloc), data(allocator.allocate(n)), size(n), space(n)
  {}
  // ...
};
 
int main() {
  std::allocator<int> myAllocator;
  vector_base<int> vb(myAllocator, 10);
  
  return 0;
}
1
1 / 1 / 1
Регистрация: 02.03.2013
Сообщений: 169
26.05.2019, 19:09  [ТС] 4
Azazel-San, почему вы написали:
C++
1
2
std::allocator<int> myAllocator;
vector_base<int> vb(myAllocator, 10);
Должно быть два параметра шаблона?! Разве нет?
0
Don't worry, be happy
16986 / 9864 / 1900
Регистрация: 27.09.2012
Сообщений: 24,461
Записей в блоге: 1
26.05.2019, 19:19 5
schoolboy_, обратите внимание, второй параметр имеет значение по-умолчанию.
0
1 / 1 / 1
Регистрация: 02.03.2013
Сообщений: 169
26.05.2019, 19:26  [ТС] 6
Croessmah, я не понял что значит ваша фраза.
0
Don't worry, be happy
16986 / 9864 / 1900
Регистрация: 27.09.2012
Сообщений: 24,461
Записей в блоге: 1
26.05.2019, 19:27 7
schoolboy_,
C++
1
2
template <typename T, typename A = allocator<T>> //Второму параметру задано значение по-умолчанию
struct vector_base
1
1 / 1 / 1
Регистрация: 02.03.2013
Сообщений: 169
26.05.2019, 19:36  [ТС] 8
Croessmah, это значит, что если мы не передаём аллокатор, то будет использован аллокатор из стандартной библиотеки?

Добавлено через 6 минут
Ещё у меня вопрос про ключевое слово const. Я старался руководствоваться правилом - "const делает константным то, что стоит слева." Значит, такой код говорит нам, что allocator- константа.
C++
1
vector_base(A const& alloc, size_t n)
а этот код ему эквивалентен. Разве нет?
C++
1
 vector_base(const A &alloc, size_t n)
0
"C with Classes"
1627 / 1251 / 474
Регистрация: 16.08.2014
Сообщений: 5,240
Записей в блоге: 1
26.05.2019, 20:17 9
Цитата Сообщение от schoolboy_ Посмотреть сообщение
а этот код ему эквивалентен. Разве нет?
да, и так и так разрешается

Добавлено через 6 минут
Цитата Сообщение от schoolboy_ Посмотреть сообщение
будет использован аллокатор из стандартной библиотеки?
будет использоваться тип соответствующий умолчательному имени, то есть тип первого параметра должен будет иметь имя allocator<T>, то есть ты не можешь передать первый аргумент например vector<T>
1
1 / 1 / 1
Регистрация: 02.03.2013
Сообщений: 169
30.05.2019, 18:32  [ТС] 10
А что если я решу реализовать класс vector, который будет наследником vector_base вот так:
Кликните здесь для просмотра всего текста

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
template <typename T, typename A = std::allocator<T>>
struct vector_base
{
  A       allocator;
  T*      data;
  size_t  size;
  size_t  space;
 
  vector_base(A const& alloc, size_t n)
      :allocator(alloc), data(allocator.allocate(n)), size(n), space(n)
  {}
 
  ~vector_base() {allocator.deallocate(data, space);}
};
template <typename T, typename A = std::allocator<T>>
    class vector : private vector_base<T, A>
    {
     public:
      vector(A const& alloc, size_t n);
      ~vector();
 
    };


Вопрос в том, что должен делать конструктор класса вектор? Как реализовать его так, чтобы он был максимально похож на вектор из стандартной библиотеки.
Что-то типо в этом духе:
Кликните здесь для просмотра всего текста

C++
1
2
3
4
5
6
7
8
9
template<typename T, typename A>
vector<T, A>::vector(const A &alloc, size_t n)
  :vector_base<T, A>::vector_base(alloc, n)
  {
    for (size_t i = 0; i < this->size; i++)
    {
      this->allocator.construct(&this->data[i], T());
    }
  }
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
30.05.2019, 18:32

Заказываю контрольные, курсовые, дипломные работы и диссертации здесь.

(std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&
astxx::manager::connection::connection(std::basic_string&lt;char, std::char_traits&lt;char&gt;,...

std::allocator
я не смог найти хорошего описания роботы с аллокатором, так что спрашиваю у тех, кто с ним работал...

std::allocator
Здравствуйте! Подскажите почему возникает ошибка сегментирования: using std::cout; using...

allocator std::map
Подскажите вопрос, есть тестовое задание: Подскажите где про это почитать и разъясните...

Std::allocator<wchar_t>>' to 'LPCWSTR'
собственно есть list&lt;wstring&gt; куда вставили много адресов типа L&quot;D:\\66\\99&quot;; Задача удалять папки...

Что такое std::allocator<T> ?
я так понял возвращает адрес чего то?


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

Или воспользуйтесь поиском по форуму:
10
Ответ Создать тему
Опции темы

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