无法将‘std::vector<double>*’转换为‘__gnu_cxx::__alloc_traits<std::allocator<double*>, double*>::value_type’ {aka ‘double*’}

问题描述

我无法在这里将双精度转换为双精度 在 main.h 我有

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>::value_type’ {aka ‘double*’}

解决方法

混合使用 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}} 变为无效。