To write a test routine for a template class or function,you have to choose one concrete type for every formal typeof the template and run all tests on this instantiationof the template. Consider this buggy template function:
template double max (T t1, T t2) { return t1>t2 ? t1 : t2; }
Clearly, the return value should be a T, not a double.Errors like that appear surprisingly frequently, because many templateswere originally designed as non-template classes/functions. If yourtest routine only tests the case that T is double,this error does not reveal itself!
The first conclusion is obvious: A sound test of a template checksseveral instantiations, and in that, every formal type parameter isto be instantiated by more than one type.
The second conclusion is less obvious: Every formal type parametershould also be instantiated at least once by a self-definedtype. Why? Even if you test the above function maxusing various built-in types such as double, int,and char, your test routine might not encounter an error,because all of these types are silently converted to double!