Prompt a fatal error and exit if 2 classes have the same name

this is not possible and may hint to a problem with the
suppression of template arguments. In addition such a dictionary
would not compile.
Extend recursion to templates which are not marked for args removal

this is important for cases which imply a transformation of the kind
A<int, double, 3> --> A<int>
in presence of, for example, collections or other templates:
std::vector<A<int, double, 3>> must become std::vector<A<int>>
even if vector is not marked for template arguments manipulation.
Cover pointer and {r,l}reference types in KeepNParams function.
Additional comments and cosmetics were added.