Я изучаю/играю с распределителями, пытаясь понять, как это работает. Но у меня возникают проблемы с попыткой реализовать тривиальный контейнер, который принимает распределитель. Сейчас я закончил с этим:тривиальный контейнер, предназначенный для распределителя?
template<class T, class Allocator =std::allocator<T>> class Container {
public:
using allocator_type = Allocator;
using value_type = T;
using pointer = typename std::allocator_traits<allocator_type>::pointer;
using reference = value_type&;
using size_type = std::size_t;
Container(size_type n =0 , const allocator_type& allocator =allocator_type()){
std::cout << "ctor" << std::endl;
allocator.allocate(n);
};
};
int main(int argc, const char* argv[]){
Container<int> c {5};
return 0;
}
Это дает мне ошибку member function 'allocate' not viable: 'this' argument has type 'const allocator_type' (aka 'const std::__1::allocator<int>'), but function is not marked const
Как исправить эту ошибку, пожалуйста? Я что-то упускаю ? Я намерен использовать черты позже, но сначала хотел бы, чтобы он работал, используя старый путь.
It это не функция, но это 'allocator', который помечен' const'. Вы можете посмотреть, как libC++, libstdC++ реализует это в чем-то вроде 'std :: vector'. – NathanOliver
стандартные контейнеры обычно используют эту константную ссылку для инициализации своего собственного члена (или базового класса) и выделения вызова для этого элемента. – SergeyA