From 3e08c22028933be56078bdbeb1684dfafbf536d7 Mon Sep 17 00:00:00 2001 From: Benoit Jacob Date: Thu, 11 Mar 2010 12:41:46 -0500 Subject: [PATCH] attempt to fix #101 --- Eigen/src/Core/util/ForwardDeclarations.h | 15 ++++++++++++--- 1 file changed, 12 insertions(+), 3 deletions(-) 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;