Because macros do not behave as function calls but merely as text substitutions, they might exhibit strange behaviors during complex calls. For instance:
#define mul (t) t*t*t
mul(3+3) gives 24 though the expected result is 216.
Templates, on the other hand, follow the semantics of function definition and function call. They also enforce type checking unlike macros:
template <class type>
type mul_t (type t)
mul_t(3+3) gives expected result of 216.