template<typename T> T func();
template<typename T> T func(T);
template<typename T> T func(T, T);
template<typename T, typename T2> T func();
template<typename T, typename T2> T func(T2);...
Type: Posts; User: Elysia
template<typename T> T func();
template<typename T> T func(T);
template<typename T> T func(T, T);
template<typename T, typename T2> T func();
template<typename T, typename T2> T func(T2);...
As explained, it has nothing to do with specialization and everything to do with you using the improper types.
const char* arr[] -> Arrays of pointers to const char.
const char** arr -> Pointers to...
That's right. You're defining an array of 5 elements of type const char* (pointer to const char, not const pointer to char).
(Although your function wants a constant POINTER to char*.)