Класс Matrix: «Ни один экземпляр перегруженной функции push_back не соответствует списку аргументов» - PullRequest
0 голосов
/ 23 марта 2019

Итак, я создаю класс, который представляет матрицу произвольного размера, и я хочу написать функцию, которая «экспортирует» внутренний вектор в двумерный массив.

Я нашел некоторый код , который, кажется, делает то, что я хочу.Вот как выглядит код в моем классе:

// 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 должен быть автоматическим, а не автоматическим, потому что "очень важно не допустить, чтобы vec был временной копией."

Тем не менее, в Visual Studio я всегда получаю сообщение об ошибке "ни один экземпляр перегруженной функции push_back не соответствует списку аргументов ... типы аргументов (const double *)"

Итак, мой вопрос, как я могузаставить это работать без изменения авто и авто?Кроме того, как можно расширить это до 3 измерений?

1 Ответ

1 голос
/ 23 марта 2019

Вы столкнулись с проблемой const.

Предполагая, что mat имеет тип std::vector<std::vector<double>>, vec будет иметь тип std::vector<double> const& в функции. Функция-член data() для const объектов возвращает const*, а не обычный указатель.

Следовательно, вам нужно использовать:

vector<double const*> ptrs;

Но тогда, используя

return ptrs.data();

вызовет большие проблемы. ptrs является локальной переменной функции. Это будет уничтожено, когда функция вернется. Следовательно, возвращаемый указатель будет висящим указателем.

Варианты решения этой проблемы.

  1. Измените тип возврата на std::vector<double const*>.
  2. Создайте динамический массив double const** и верните его.

Я настоятельно рекомендую первый вариант.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...