关于一个处理字符串的函数模板显式特化有关问题

关于一个处理字符串的函数模板显式特化问题
利用模板,input()输入int数组或者double数组,show()显式数组的内容,maxn()找出数组中最大的值。利用模板的显式特化,input()输入2个字符串,show()显式字符串,maxn()找出最长的字符串,程序编译没有错误,但运行后,执行到调用特化后字符串版本的show()之后出现错误退出。以下是代码,int版本和double略去,只留下特化版本。请高手帮我看看问题出在哪里,应该怎么修改。万分感谢!
#include   <iostream>
#include   <cstring>
using   namespace   std;

//函数模板
template   <typename   T>   T   maxn(T   arr[],   int   n);

template   <typename   T>   void   input(T   arr[],   int   n);

template   <typename   T>   void   show(T   arr[],   int   n);

//模板特化
template   <>   char*   maxn   <char*>   (char*   arr[],   int   n);

template   <>   void   input   <char*>   (char*   arr[],   int   n);

template   <>   void   show   <char*>   (char*   arr[],   int   n);

//main   function
int   main()
{
//int版本略...
{....}
                  //double版本略...
{.....}

//字符串版本(利用模板显式特化)
char   strArr[2][20];
input   <char*>   (strArr,   2);//将两个字符串读入数组
show   <char*>   (strArr,   2);//显示数组的内容
cout < < "max:   " < <maxn(strArr,   2) < <endl;//输出最长的字符串

return   0;
}

//模板定义略
{...}

//模板显式特化定义
template   <>   void   input   <char*>   (char*   arr[],   int   n)
{
cout < < "string   version " < <endl;
cout < < "enter   " < <n < < "   string:\n ";

char   temp[20];
for   (int   i=0;   i <n;   i++)
{  
cout < < "No   " < <i+1 < < ": ";
cin.getline(temp,   20);
strcpy(arr[i],   temp);
}
}

template   <>   void   show   <char*>   (char*   arr[],   int   n)
{
cout < < "you   entered: " < <endl;
for   (int   i=0;   i <n;   i++)
{
        cout < <arr[i] < <endl;
}
}

template   <>   char*   maxn   <char*>   (char*   arr[],   int   n)
{
int   max_index=0;         //array   index   of   max   element
for   (int   i=0;   i <n;   i++)
{
if   (strlen(arr[i])   >   strlen(   arr[max_index]   )   )
max_index=i;
}
return   arr[max_index];
}

------解决方案--------------------
编译是不能通过的吧
二维数组参数传递的问题
对于char str[2][20];
它的类型是char (*)[20];
你用char *[]这样类型不匹配吧

------解决方案--------------------
函数模版这个不建议重载的,好像优先级很低,比通用模板还底,也指不定是那种情况
还是有优先级很高的函数重载吧