Ошибка «Использование удаленной функции» при копировании объекта пользовательского класса, включая Eigen :: CholmodDecomposition - PullRequest
1 голос
/ 29 сентября 2019

Я хочу избежать инициализации объекта Eigen::CholmodDecomposition каждый раз, когда я хочу решить разреженную систему.Для этого я создал собственный класс.Разреженный решатель инициализируется с классом и затем используется всякий раз, когда это необходимо, без необходимости повторной инициализации.Одна вещь, которую мне нужно сделать позже, - это копирование таких объектов.

Когда я включаю (1) Eigen::CholmodDecomposition в определение класса и (2) операцию копирования, я получаю ошибки ниже.Если я удаляю либо (без копии, либо без Eigen::CholmodDecomposition в классе), то ошибки не возникает.

Что я ломаю?Почему это не работает?Как мне сделать эту работу?

#include <RcppEigen.h>

using namespace std;

class TestClass{
public:
  Eigen::CholmodDecomposition<Eigen::SparseMatrix<double> > solver;

  Eigen::MatrixXd solve(const Eigen::SparseMatrix<double>&,
                        const Eigen::MatrixXd&);
  TestClass(){};
};

Eigen::MatrixXd TestClass::solve(const Eigen::SparseMatrix<double>& A, const Eigen::MatrixXd& b){
  solver.compute(A);
  return solver.solve(b);
}

//[[Rcpp::export]]
Eigen::MatrixXd cholmodsolver(const Eigen::SparseMatrix<double>& A,
                              const Eigen::MatrixXd& b){
  TestClass test;

  TestClass test2 = test;
  return test2.solve(A, b);
}

Это дает ошибки:

error: use of deleted function ‘TestClass::TestClass(const TestClass&)’
   TestClass test2 = test;
                     ^~~~
note: ‘TestClass::TestClass(const TestClass&)’ is implicitly deleted because the default definition would be ill-formed:
 class TestClass{
       ^~~~~~~~~
error: use of deleted function ‘Eigen::CholmodDecomposition<Eigen::SparseMatrix<double, 0, int> >::CholmodDecomposition(const Eigen::CholmodDecomposition<Eigen::SparseMatrix<double, 0, int> >&)’

       ^~~~~~~~~~~~~~~~~~~~

1 Ответ

2 голосов
/ 29 сентября 2019

Ошибка связана с тем, что Eigen :: CholmodDecomposition является классом, который нельзя скопировать так же, как std :: unique_ptr.Это приводит к тому, что конструктор копирования TestClass, который имеет член типа Eigen :: CholmodDecomposition, неявно определяется как удаленный.

Это следует одному из правил C ++ 11:

C ++ 11 § 12.8, p23:

По умолчанию конструктор копирования / перемещения для класса X определен как удаленный (8.4.3), если X имеет:
...
нестатический член данных типа класса M (или его массив), который не может быть скопирован / перемещен, поскольку разрешение перегрузки (13.3) применительно к соответствующему конструктору M приводит к неоднозначности или функции, которая удаляется или недоступна из значения по умолчаниюконструктор,
...

...