问题描述
std::vector<std::vector<double>> *m_va;
std::vector<std::vector<double> > *get_ptr() { return m_va; }
在 main.cpp 中我想要:
std::vector<double *> F(n);
F[i] = this->get_ptr()[j].data();
但我得到了:
无法将‘std::vector’转换为‘__gnu_cxx::__alloc_traitsstd::allocator
解决方法
混合使用 C 和 C++ 方法时要小心。
std::vector
是一个对象,您不能将指向该对象的指针视为指向底层缓冲区的指针。
您的 get_ptr()
方法返回一个指向向量的指针,而不是向量本身或对它的引用,因此括号未映射为对 operator[]
的调用*m_va
,但改为 *(m_va + j)
(在您的情况下可能会导致未定义的行为)。
然后在假定存在于该位置的 data()
上调用 std::vector<std::vector<double>>
将返回一个指向底层缓冲区开头的指针,其中内容的类型为 std::vector<double>
(因此这个指针是 std::vector<double>*
类型,这就是为什么会出现编译错误。
F[i] = (*(this->get_ptr()))[j].data();
会解决问题,这相当于
F[i] = this->get_ptr()->operator[](j).data();
就像个人建议一样,请注意您在做什么,如果在 *m_va
的任何元素中发生重新分配,则您将 STL 容器持有的原始指针存储在另一个对象中,{{ 1}} 变为无效。