From 8d8acc3ab4f0b3f45f2a8bc25c0b7f5f66a22024 Mon Sep 17 00:00:00 2001 From: Gael Guennebaud Date: Wed, 4 Dec 2013 22:58:19 +0100 Subject: Move inner product special functions to a base class to avoid ambiguous calls --- Eigen/src/Core/Product.h | 50 +++++++++++++++++++++++++++++++++++++++--------- 1 file changed, 41 insertions(+), 9 deletions(-) (limited to 'Eigen/src/Core/Product.h') diff --git a/Eigen/src/Core/Product.h b/Eigen/src/Core/Product.h index b37fd2ff7..79d09fbb6 100644 --- a/Eigen/src/Core/Product.h +++ b/Eigen/src/Core/Product.h @@ -79,12 +79,6 @@ class Product : public ProductImpl<_Lhs,_Rhs,Option, const LhsNestedCleaned& lhs() const { return m_lhs; } const RhsNestedCleaned& rhs() const { return m_rhs; } - - /** Convertion to scalar for inner-products */ - operator const Scalar() const { - EIGEN_STATIC_ASSERT(SizeAtCompileTime==1, IMPLICIT_CONVERSION_TO_SCALAR_IS_FOR_INNER_PRODUCT_ONLY); - return typename internal::evaluator::type(*this).coeff(0,0); - } protected: @@ -92,13 +86,51 @@ class Product : public ProductImpl<_Lhs,_Rhs,Option, RhsNested m_rhs; }; +namespace internal { + +template::ret> +class dense_product_base + : public internal::dense_xpr_base >::type +{}; + +/** Convertion to scalar for inner-products */ template -class ProductImpl : public internal::dense_xpr_base >::type +class dense_product_base + : public internal::dense_xpr_base >::type +{ + typedef Product ProductXpr; + typedef typename internal::dense_xpr_base::type Base; +public: + using Base::derived; + typedef typename Base::Scalar Scalar; + typedef typename Base::Index Index; + + operator const Scalar() const + { + return typename internal::evaluator::type(derived()).coeff(0,0); + } + + Scalar coeff(Index row, Index col) const + { + return typename internal::evaluator::type(derived()).coeff(row,col); + } + + Scalar coeff(Index i) const + { + return typename internal::evaluator::type(derived()).coeff(i); + } +}; + +} // namespace internal + +template +class ProductImpl + : public internal::dense_product_base { typedef Product Derived; public: - - typedef typename internal::dense_xpr_base >::type Base; + + typedef typename internal::dense_product_base Base; EIGEN_DENSE_PUBLIC_INTERFACE(Derived) }; -- cgit v1.2.3