在构造函数中初始化共享指针的类的向量

时间:2019-08-15 21:36:11

标签: c++ smart-pointers

我在int中创建了一个名为x的{​​{1}}类型的向量,然后希望我的类main的实例名为A来初始化其向量ax_vec的共享指针。如果通过引用或值传递向量x,但如果将向量x作为指针传递,则可以成功初始化共享指针(因此,如果x发生变化, x),然后收到错误消息:

x_vec

我的代码:

/usr/include/c++/6/ext/new_allocator.h:120:4: error: cannot convert ‘std::vector<int>’ to ‘int’ in initialization
  { ::new((void *)__p) _Up(std::forward<_Args>(__args)...); }

感谢您的帮助和耐心,因为我缺乏理解。

1 个答案:

答案 0 :(得分:0)

A(std::vector<int>* a_val)

a_val作为指针传递。这意味着在

x_vec.emplace_back(std::make_shared<int> (a_val[i]));

a_val[i]索引了指针a_val,而不是它指向的vector,从而导致元素std::vector<int>而不是int

您可以

x_vec.emplace_back(std::make_shared<int> ((*a_val)[i]));

并取消引用指针以获取vector的{​​{1}}而不是指针,但是解决此问题的正确方法是...

解决方案:不要传递指针。使用参考

operator []

由于仅被读取,因此A(std::vector<int> & a_val) 引用可能是为了接受常量和临时变量。

const

使用

调用
A(const std::vector<int> & a_val)

代替

A a(x);

编辑:

缺少一点后飞溅:

A a(&x);

需要成为

for(int i = 0; i < a_val->size(); ++i)

因为a_val不再是指针,可能应该是

for (int i = 0; i < a_val.size(); ++i)

因为for (size_t i = 0; i < a_val.size(); ++i) 不返回size()

删除调试语句时,请考虑将其转换为基于范围的for循环。

int