diff options
author | Gael Guennebaud <g.gael@free.fr> | 2009-08-15 11:52:50 +0200 |
---|---|---|
committer | Gael Guennebaud <g.gael@free.fr> | 2009-08-15 11:52:50 +0200 |
commit | 7b60713e87ba24d3b0fa8f486bba8665151e9f31 (patch) | |
tree | fad067958c8c5e0b663e69e5facee72661e24128 /Eigen/src | |
parent | 0da31a6e1dfa06ec87b967a4124d03c3cf3a4389 (diff) |
my previous fix was not very good
Diffstat (limited to 'Eigen/src')
-rw-r--r-- | Eigen/src/Core/ProductBase.h | 26 | ||||
-rw-r--r-- | Eigen/src/Core/util/Meta.h | 7 |
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> { |