Your reply provided the key, thank you.
I misunderstood what multiply_typeof_helper was for.  It's like common_type<> in C++0X, but its more specialized for each kind of operator.
Which is obviously important for units.
My program compiles and runs now. Thanks again.
 
terry
 
BTW, the return statement is not recursive, because it swaps the lhs and rhs.
 
 
// vector * T
template<int Dim, class T1, class T2> inline
typename boost::units::multiply_typeof_helper<T2, vector<Dim, T1> >::type
operator*(const vector<Dim, T1>&lhs, const T2& rhs)
  { return rhs * lhs; }

Since multiply_typeof_helper<T1,T2> is really just a glorified version of typeof(T1()*T2()), what you're saying here is that the return type of the product of a vector and a scalar is the return type of the product of a vector and a scalar. You need to define the top-level multiply operation; define it something like this :

// vector * T
template<int Dim, class T1, class T2inline
vector<Dim,typename boost::units::multiply_typeof_helper<T2T1 >::type>
operator*(const vector<Dim, T1>&lhs, const T2& rhs)
{ //return rhs * lhs; this return statement is also wrong, since it is recursive, defining the returned value in terms of the operator itself...}

Cheers,

Matthias