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*tmul(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 type mul_t (type t){return t*t*t;}mul_t(3+3) gives expected result of 216.