When we specialize a function template, we must supply arguments for every template parameter in the original template. To indicate that we are specializing a template, we use the keyword template
followed by an empty pair of angle brackets (< >
). The empty brackets indicate that arguments will be supplied for all the template parameters of the original template:
// special version of compare to handle pointers to character arrays
template <>
int compare(const char* const &p1, const char* const &p2)
{
return strcmp(p1, p2);
}
The hard part in understanding this specialization is the function parameter types. When we define a specialization, the function parameter type(s) must match the corresponding types in a previously declared template. Here we are specializing:
template <typename T> int compare(const T&, const T&);
in which the function parameters are references to a const
type. As with type aliases, the interaction between template parameter types, pointers, and const
can be surprising (§ 2.5.1, p. 68).
We want to define a specialization of this function with T
as const char*
. Our function requires a reference to the const
version of this type. The const
version of a pointer type is a constant pointer as distinct from a pointer to const
(§ 2.4.2, p. 63). The type we need to use in our specialization is const char* const &
, which is a reference to a const
pointer to const char
.