aboutsummaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorGravatar Gael Guennebaud <g.gael@free.fr>2009-08-15 11:52:50 +0200
committerGravatar Gael Guennebaud <g.gael@free.fr>2009-08-15 11:52:50 +0200
commit7b60713e87ba24d3b0fa8f486bba8665151e9f31 (patch)
treefad067958c8c5e0b663e69e5facee72661e24128
parent0da31a6e1dfa06ec87b967a4124d03c3cf3a4389 (diff)
my previous fix was not very good
-rw-r--r--Eigen/src/Core/ProductBase.h26
-rw-r--r--Eigen/src/Core/util/Meta.h7
2 files changed, 22 insertions, 11 deletions
diff --git a/Eigen/src/Core/ProductBase.h b/Eigen/src/Core/ProductBase.h
index 2090a0e49..b5ed5ae8f 100644
--- a/Eigen/src/Core/ProductBase.h
+++ b/Eigen/src/Core/ProductBase.h
@@ -149,15 +149,31 @@ class ScaledProduct;
// define all overloads defined in MatrixBase. Furthermore, Using
// "using Base::operator*" would not work with MSVC.
//
-// Also note that here we accept any type which can be converted to Derived::Scalar.
-template<typename Derived,typename Lhs,typename Rhs,typename Scalar>
-const ScaledProduct<Derived> operator*(const ProductBase<Derived,Lhs,Rhs>& prod, Scalar x)
+// Also note that here we accept any compatible scalar types
+template<typename Derived,typename Lhs,typename Rhs>
+const ScaledProduct<Derived>
+operator*(const ProductBase<Derived,Lhs,Rhs>& prod, typename Derived::Scalar x)
{ return ScaledProduct<Derived>(prod.derived(), x); }
-template<typename Derived,typename Lhs,typename Rhs,typename Scalar>
-const ScaledProduct<Derived> operator*(Scalar x,const ProductBase<Derived,Lhs,Rhs>& prod)
+template<typename Derived,typename Lhs,typename Rhs>
+typename ei_enable_if<!ei_is_same_type<typename Derived::Scalar,typename Derived::RealScalar>::ret,
+ const ScaledProduct<Derived> >::type
+operator*(const ProductBase<Derived,Lhs,Rhs>& prod, typename Derived::RealScalar x)
{ return ScaledProduct<Derived>(prod.derived(), x); }
+
+template<typename Derived,typename Lhs,typename Rhs>
+const ScaledProduct<Derived>
+operator*(typename Derived::Scalar x,const ProductBase<Derived,Lhs,Rhs>& prod)
+{ return ScaledProduct<Derived>(prod.derived(), x); }
+
+template<typename Derived,typename Lhs,typename Rhs>
+typename ei_enable_if<!ei_is_same_type<typename Derived::Scalar,typename Derived::RealScalar>::ret,
+ const ScaledProduct<Derived> >::type
+operator*(typename Derived::RealScalar x,const ProductBase<Derived,Lhs,Rhs>& prod)
+{ return ScaledProduct<Derived>(prod.derived(), x); }
+
+
template<typename NestedProduct>
struct ei_traits<ScaledProduct<NestedProduct> >
: ei_traits<ProductBase<ScaledProduct<NestedProduct>,
diff --git a/Eigen/src/Core/util/Meta.h b/Eigen/src/Core/util/Meta.h
index 029d966fd..3a960bea6 100644
--- a/Eigen/src/Core/util/Meta.h
+++ b/Eigen/src/Core/util/Meta.h
@@ -155,12 +155,7 @@ template<int Y, int InfX, int SupX>
class ei_meta_sqrt<Y, InfX, SupX, true> { public: enum { ret = (SupX*SupX <= Y) ? SupX : InfX }; };
/** \internal determines whether the product of two numeric types is allowed and what the return type is */
-template<typename T, typename U> struct ei_scalar_product_traits
-{
- // dummy general case where T and U aren't compatible -- not allowed anyway but we catch it elsewhere
- //enum { Cost = NumTraits<T>::MulCost };
- typedef T ReturnType;
-};
+template<typename T, typename U> struct ei_scalar_product_traits;
template<typename T> struct ei_scalar_product_traits<T,T>
{