Visual studio 2015. c++ compiler error C2280 attempting to reference a deleted function

烂漫一生 提交于 2019-12-08 08:48:56

问题


What i am trying to do is to compile project which was built by CMake. In my code i have next method:

/** "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;
}

When i try to compile i get next error:

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

at line

other = otherCopy;

How can i get rid of it?

UPD

When i hit F12 ("Go to definition") on OtherDerived, cursor jumps to the line #332 in the following file: http://codepad.org/9zN8inib

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

(top one)


回答1:


I ran into this myself, turned out to be a bug in Eigen. In my case, just replacing the following line in src/Eigen/Eigen/src/Core/util/Macros.h

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

with

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

solved this issue. The assignment operators are then generated.




回答2:


It seems that you try to reinitialize the reference by doing

OtherDerived& other = _other.const_cast_derived();

and then

other = otherCopy;


来源:https://stackoverflow.com/questions/43472463/visual-studio-2015-c-compiler-error-c2280-attempting-to-reference-a-deleted-f

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!