The third alternative is the best.
A template allows a class description to be parameterized, much as a function is parameterized.
Parameter values are types, and can be used as type names within the class description.