【问题标题】:Error when using the std::allocator in the template class在模板类中使用 std::allocator 时出错
【发布时间】:2019-05-26 12:18:41
【问题描述】:

试图弄清楚如何使用 std :: allocator。

#include <iostream>

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> my_allocator;
  vector_base<int, std::allocator<int>> vector(my_allocator, 10);

  return 0;
}

错误:

错误:将“const std::allocator”作为“this”参数传递会丢弃 限定词 [-fpermissive] :allocator(alloc), data(alloc.allocate(n)), size(n), space(n)

【问题讨论】:

  • alloc.allocate(n) 您尝试在 const 引用上调用非常量成员函数

标签: c++ allocator


【解决方案1】:

alloc 是一个const&amp;,你试图在它上面调用allocate,这是一个非常量的方法,这是不允许的。

改为在您的已初始化成员上调用 allocate

  vector_base(const A &alloc, size_t n)
    :allocator(alloc), data(allocator.allocate(n)), size(n), space(n)
  {}

【讨论】:

  • 我建议不要依赖于声明数据成员的顺序。我会将data = allocator.allocate(n) 放在函数体中。这样,如果有人将 allocator 的声明移到 data 之后,代码不会中断。
  • @L.F.不能确定 OP 运行 11+,但通常你会这样做
  • 我想你误会了。 “body”是指构造函数的主体,而不是类内成员初始化器;-)
  • 编译器不会仍然移动初始化,因为初始化的顺序是预定义的?不过,可能发生的情况是,有人更改了类声明中的字段顺序。那么这是一个问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-06-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-01-31
  • 1970-01-01
  • 2010-12-06
相关资源
最近更新 更多