Visual studio 2015. Ошибка компилятора c ++. C2280 пытается обратиться к удаленной функции.

То, что я пытаюсь сделать, это скомпилировать проект, который был построен CMake. В моем коде у меня есть следующий метод:

/** "in-place" version of TriangularView::solve() where the result is written in \a other
*
* \warning The parameter is only marked 'const' to make the C++ compiler accept a temporary expression here.
* This function will const_cast it, so constness isn't honored here.
*
* See TriangularView:solve() for the details.
*/
template<typename MatrixType, unsigned int Mode>
template<int Side, typename OtherDerived>
void TriangularView<MatrixType,Mode>::solveInPlace(const MatrixBase<OtherDerived>& _other) const
{
OtherDerived& other = _other.const_cast_derived();
eigen_assert( cols() == rows() && ((Side==OnTheLeft && cols() == other.rows()) || (Side==OnTheRight && cols() == other.cols())) );
eigen_assert((!(Mode & ZeroDiag)) && bool(Mode & (Upper|Lower)));

enum { copy = internal::traits<OtherDerived>::Flags & RowMajorBit  && OtherDerived::IsVectorAtCompileTime };
typedef typename internal::conditional<copy,
typename internal::plain_matrix_type_column_major<OtherDerived>::type, OtherDerived&>::type OtherCopy;
OtherCopy otherCopy(other);

internal::triangular_solver_selector<MatrixType, typename internal::remove_reference<OtherCopy>::type,
Side, Mode>::run(nestedExpression(), otherCopy);

if (copy)
other = otherCopy;
}

Когда я пытаюсь скомпилировать, я получаю следующую ошибку:

error C2280 "Eigen::Block<Derived,-1,-1,false> &Eigen::Block<Derived,-1,-1,false>::operator =(const Eigen::Block<Derived,-1,-1,false> &)": attempting to reference a deleted function

на линии

other = otherCopy;

Как я могу избавиться от этого?

UPD

Когда я нажимаю F12 («Перейти к определению») в OtherDerived, курсор переходит на строку # 332 в следующем файле: http://codepad.org/9zN8inib

template<int Side, typename OtherDerived>
void solveInPlace(const MatrixBase<OtherDerived>& other) const;

(лучший)

1

Решение

Я столкнулся с этим сам, оказался ошибка в Эйгене. В моем случае, просто заменив следующую строку в src / Eigen / Eigen / src / Core / util / Macros.h

#if defined(_MSC_VER) && (!defined(__INTEL_COMPILER))

с

#if defined(_MSC_VER) && (_MSC_VER < 1900) && (!defined(__INTEL_COMPILER))

решил эту проблему. Затем создаются операторы присваивания.

1

Другие решения

Кажется, что вы пытаетесь повторно инициализировать ссылку, выполнив

OtherDerived& other = _other.const_cast_derived();

а потом

other = otherCopy;
0

По вопросам рекламы [email protected]