@Jose
That depends. The C preprocessor knows absolutely nothing about C as a language and will happily create the most illegal code possible if you aren't careful.
Templates in C++, on the other hand, are part of the language specification and have strict rules.
As for a class versus a template class, it really depends on your particular needs.
If you need run time polymorphic behaviuour and speed is not absolutely critical, abstract classes are the way to go.
Templates, on the other hand, are designed to allow you to create "generic" code. Every version of a template you make results in something like a new handwritten class based on your template parameters being created by the compiler. Consequently code can bloat a lot if you are not careful. Thankfully, its easy to specialise templates to avoid that. For example, suppose you made some container template "MyContainer", you could save a lot by making a specialisation for pointers by making the MyContaier as a specialisation for all MyContainer. In effect, what you end up with is a single class that handles void* and a bunch of templates that just wrap it with type-safe behaviour, adding no additional code to the executable.