Using defines instead of typedefs is troubling under another important aspect, and namely the concept of type traits. Consider different classes (think of standard containers) all of which define their specific typedefs. You can write generic code by referring to the typedefs. Examples of this include the general container requirements (c++ standard 23.2.1 [container.requirements.general]) like
X::value_type
X::reference
X::difference_type
X::size_type
All of this is not expressible in a generic way with a macro because it is not scoped.