unittest { Mass m; Velocity v; pragma(msg, typeof(m * v).stringof); pragma(msg, typeof(v * m).stringof); static assert(is(typeof(m * v) == double)); static assert(is(typeof(v * m) == double)); } Currently the type of m * v is Velocity, and the type of v * m is Mass. The only reasonable type of an operation (if it compiles at all) should be double, obtained after both operands are converted to their supertype.
Dropping typedef, so won't fix.