关于一个处理字符串的函数模板显式特化有关问题
关于一个处理字符串的函数模板显式特化问题
利用模板,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 *[]这样类型不匹配吧
------解决方案--------------------
函数模版这个不建议重载的,好像优先级很低,比通用模板还底,也指不定是那种情况
还是有优先级很高的函数重载吧
利用模板,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 *[]这样类型不匹配吧
------解决方案--------------------
函数模版这个不建议重载的,好像优先级很低,比通用模板还底,也指不定是那种情况
还是有优先级很高的函数重载吧