diff --git a/Eigen/src/Core/util/ForwardDeclarations.h b/Eigen/src/Core/util/ForwardDeclarations.h index aa01fdab2..129b78e6a 100644 --- a/Eigen/src/Core/util/ForwardDeclarations.h +++ b/Eigen/src/Core/util/ForwardDeclarations.h @@ -41,10 +41,19 @@ template class NestByValue; template class ForceAlignedAccess; template class SwapWrapper; template class Minor; -// MSVC will not compile when the expression ei_traits::Flags&DirectAccessBit -// is put into brackets like (ei_traits::Flags&DirectAccessBit)! + +// MSVC has a big bug: when the expression ei_traits::Flags&DirectAccessBit ? HasDirectAccess : NoDirectAccess +// is used as default template parameter value here, it gets mis-evaluated as just ei_traits::Flags +// Moreover, adding brackets tends to give compilation errors with MSVC. +// Solution: defer that to a helper struct. +template +struct ei_block_direct_access_status +{ + enum { ret = ei_traits::Flags&DirectAccessBit ? HasDirectAccess : NoDirectAccess }; +}; template::Flags&DirectAccessBit ? HasDirectAccess : NoDirectAccess> class Block; + int _DirectAccessStatus = ei_block_direct_access_status::ret> class Block; + template class VectorBlock; template class Transpose; template class Conjugate;