【问题标题】:Matrix class: "No instance of overloaded function push_back matches the argument list"矩阵类:“没有重载函数 push_back 的实例与参数列表匹配”
【发布时间】:2019-03-23 05:19:07
【问题描述】:

所以,我正在创建一个表示任意大小矩阵的类,并且我想编写一个函数,将内部向量“导出”到二维数组。

我发现some code 似乎可以满足我的要求。以下是我课堂上的代码:

// Export matrix to array
double** Matrix::a_data() const
{
    vector<double*> ptrs;
    for (auto& vec : mat) 
    {
        ptrs.push_back(vec.data());
    }
    return ptrs.data();
}

其中mat 是向量> 用于存储矩阵的条目。

有问题的帖子指出 vec 需要成为 auto& 而不是 auto,因为“防止 vec 成为临时副本非常重要。”

但是,在 Visual Studio 中,我总是收到错误消息“没有重载函数 push_back 的实例与参数列表匹配...参数类型为 (const double*)”

所以,我的问题是,如何在不将 auto& 更改为 auto 的情况下使其工作?另外,如何将其扩展到 3 维?

【问题讨论】:

  • 更大的问题:ptrs.data()ptrs 被销毁时是一个悬空指针,当a_data() 返回时会发生这种情况。

标签: c++ matrix


【解决方案1】:

您遇到了const 问题。

假设matstd::vector&lt;std::vector&lt;double&gt;&gt; 类型,vec 在函数中将是std::vector&lt;double&gt; const&amp; 类型。 const 对象的 data() 成员函数返回 const*,而不是常规指针。

因此,您需要使用:

vector<double const*> ptrs;

然后,使用

return ptrs.data();

会导致更大的问题。 ptrs 是函数局部变量。当函数返回时,它将被破坏。因此,返回的指针将是一个悬空指针。

解决该问题的选项。

  1. 将返回类型更改为std::vector&lt;double const*&gt;
  2. 创建double const** 的动态数组并将其返回。

我强烈推荐第一个选项。

【讨论】:

  • 所以在将“vector ”更改为“vector ”后,我又遇到了另一个错误:“返回值类型与函数类型不匹配”
猜你喜欢
  • 1970-01-01
  • 2019-07-16
  • 2013-11-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多