
AMDG Peng Yu wrote:
template <typename T1, typename T2> struct multiply_traits;
template <typename T1, typename T2> struct multiply_traits<X<T1>, T2> { typedef X<T1> result_type; };
The most reliable way to define multiply_traits in general is template<class T> T make(); template<class T1, class T2> struct multiply_traits { BOOST_TYPEOF_NESTED_TYPEDEF_TPL(nested, make<T1>() * make<T2>()); typedef typename nested::type type; };
Y<BOOST_TYPEOF(T1() * T2())> operator*(const Y<T1> &y, const T2 &t)
You need to use BOOST_TYPEOF_TPL. http://www.boost.org/doc/libs/1_36_0/doc/html/typeof/refe.html#typeof.typo. Some compilers can handle this (I just tried it on msvc 9.0), but I strongly advise using multiply_traits as defined above for portability. In Christ, Steven Watanabe