简介:我希望显式的深褐色显示最长的字符串,我以为是"Carmelo Anthony",但结果是"Jordan"。我知道使用的是通用模板版本,而不是显式模板版本。所以它只是比较点的值(地址值),对吧?但是我怎么能看到"卡梅洛·安东尼"呢?谢谢你回复我的第一篇帖子!
#include <iostream>
#include <cstring> //for strlen()
template <class T> //general template
T maxn (T arr[], int n);
template <> char * maxn<char *>(char * arr[], int n); //explicit specialization
int main()
{
using namespace std;
int intArr[6] = {1, 2, 34, 6, 9, 10};
double douArr[4] = {2.34, 90.6, -83.872, -0.23};
const char * arr[5] =
{
"Hello World",
"Kobe Bryant",
"Lebron James",
"Carmelo Anthony",
"Jordan"
};
std::cout << maxn (intArr, 6) << std::endl;
std::cout << maxn (douArr, 4) << std::endl;
std::cout << maxn (arr, 5) << std::endl;
return 0;
}
template <class T>
T maxn (T arr[], int n)
{
T maxValue = arr[0];
for (int i = 1; i < n; i++)
{
maxValue = maxValue > arr[i] ? maxValue:arr[i];
}
return maxValue;
}
template <> char * maxn<char *>(char * arr[], int n)
{
char * p= arr[0]; //pointer p points to the present longest string
for (int i = 1; i < n; i++)
{
p = strlen (arr[i]) > strlen (p) ? arr[i] : p;
}
return p;
}
正如@PaulMcKenzie所建议的,问题在于缺少const
。更详细地说,您的模板专门化是针对指向非const
(即可变)char
的指针数组。这告诉编译器,您可以更改传入的字符串。但是,您传入一个const char *
数组,即不可变的字符串。编译器不允许您调用可能使const
数据上的数据发生突变的函数,因此除非您添加const
,否则它不会使用您的专用化。
作为上一个答案的补充,您可以通过提供一个简单的助手函数来专门化const char *
和char *
,两个版本都会调用这个函数:
#include <iostream>
#include <cstring> //for strlen()
template <class T> //general template
T maxn(T arr[], int n);
template <> const char * maxn<const char *>(const char * arr[], int n); //explicit specialization
template <> char * maxn<char *>(char * arr[], int n);
int main()
{
using namespace std;
int intArr[6] = { 1, 2, 34, 6, 9, 10 };
double douArr[4] = { 2.34, 90.6, -83.872, -0.23 };
const char * arr[5] =
{
"Hello World",
"Kobe Bryant",
"Lebron James",
"Carmelo Anthony",
"Jordan"
};
char * arr2[5];
for (int i = 0; i < 5; ++i)
{
arr2[i] = new char[strlen(arr[i]) + 1];
strcpy(arr2[i], arr[i]);
}
std::cout << maxn(intArr, 6) << std::endl;
std::cout << maxn(douArr, 4) << std::endl;
std::cout << maxn(arr, 5) << std::endl;
std::cout << maxn(arr2, 5) << std::endl;
return 0;
}
template <class T>
T maxn(T arr[], int n)
{
T maxValue = arr[0];
for (int i = 1; i < n; i++)
{
maxValue = maxValue > arr[i] ? maxValue : arr[i];
}
return maxValue;
}
template<typename T>
T* charHelper(T *arr[], int n)
{
T* p = arr[0];
for (int i = 1; i < n; i++)
{
p = strlen(arr[i]) > strlen(p) ? arr[i] : p;
}
return p;
}
template <> char * maxn<char *>(char * arr[], int n)
{ return charHelper<char>(arr, n); }
template <> const char * maxn<const char *>(const char * arr[], int n)
{ return charHelper<const char>(arr, n); }
输出:
34
90.6
Carmelo Anthony
Carmelo Anthony
暂时忽略main
函数中明显的内存泄漏。
请注意,对于arr
版本,调用const char*
专业化,而对于arr2
版本,则调用char *
版本。