我目前正在学习C ++,所以我对这个主题知之甚少。我正在使用C ++入门书,这就是问题所在:
编写一个模板函数maxn(),它将一个T类型的项数组作为参数 和一个整数,表示数组中的元素数并返回 数组中最大的项目。在使用函数模板的程序中测试它 六个int值的数组和四个double值的数组。该计划也应该 包括一个特殊化,它将一个指向char的数组作为参数和 作为第二个参数的指针数量,返回最长的地址 串。如果多个字符串被绑定以具有最长的长度,则该函数应该 返回第一个并列最长的地址。使用数组测试特化 五个字符串指针。
这是我的代码:
#include <iostream>
#include <cstring>
using namespace std;
template <class T> T maxn(T arr[] , int n);
template <> char * maxn<char (*)[10]> (char (*arr)[10] , int n);
int main()
{
double array[5] = { 1.2 , 4.12 ,7.32 ,2.1 ,3.5};
cout << endl << maxn(array , 5) << endl << endl;
char strings[5][6] = { "asta" , " m" , "ta" , "taree" , "e"};
cout << maxn(strings , 5) << endl;
return 0;
}
template <class T> T maxn(T arr[] , int n)
{
T max = 0;
for (int i = 0 ; i < n ; ++i)
{
if (arr[i] > max)
max = arr[i];
}
return max;
}
template <> char * maxn<char (*)[10]> (char (*arr)[10] , int n)
{
int length = 0;
int mem = 0;
for ( int i = 0 ; i < n ; ++i)
{
if (strlen(arr[i]) > length)
{
length = strlen(arr[i]);
mem = i;
}
}
return arr[mem];
}
我正在尝试传递一个字符串数组。我收到以下错误:
g++ -Wall -o "untitled5" "untitled5.cpp" (in directory: /home/eukristian)
untitled5.cpp:6: error: template-id ‘maxn<char (*)[10]>’ for ‘char* maxn(char (*)[10], int)’ does not match any template declaration
untitled5.cpp: In function ‘int main()’:
untitled5.cpp:14: error: no matching function for call to ‘maxn(char [5][6], int)’
untitled5.cpp: At global scope:
untitled5.cpp:31: error: template-id ‘maxn<char (*)[10]>’ for ‘char* maxn(char (*)[10], int)’ does not match any template declaration
Compilation failed.
我很确定我犯了一些新手的错误,我无法察觉。 谢谢。
答案 0 :(得分:7)
char (*)[10]
是指向10个字符数组的指针。 char *[10]
是一个包含10个char指针的数组。
您还要为返回值指定一个不同于T.的类型。如果函数应该返回char*
,则T的值也应该是char*
。你的专业化应该是这样的:
template <> char * maxn<char *> (char *arr[] , int n);
此外,您的字符串数组应为char *[5]
类型。
答案 1 :(得分:1)
该程序还应该包含一个特殊化,它将指向char 的数组作为参数,并将指针数作为第二个参数,并返回最长字符串的地址。 / p>
你的代码中的内容不是那个,它是一个二维的字符数组(一个5 * 6字节的内存块)。与五个指针的数组进行比较
const char* strings[5] = {"asta" , " m" , "ta" , "taree" , "e"};
您的代码也假设0是任何T的最小值。
答案 2 :(得分:1)
#include <iostream>
#include <cstring>
#include <locale>
//#include <windows.h>
using namespace std;
const int maxcharval = 5;
const int maxintval = 6;
const int maxdoubleval = 4;
template <typename T>
T maxn(T* arr, int n);
template <> const char * maxn <const char *> (const char* arr[], int n);
int main(int argc, char *argv[])
{
//setlocale(LC_CTYPE, ".866");
const char * charr[] = {"qwer","qwert","qwe","qw","q"};
const int intarr[] = {1,3,2,5,3,0};
const double doublearr[] = {5.4, 2.3, 3.1, 3.2};
cout << "maxint: " << maxn(intarr, maxintval) << endl;
cout << "maxdouble: " << maxn(doublearr, maxdoubleval)
<< endl;
cout << "maxcharstring:" << maxn(charr, maxcharval)
<< endl;
//system("pause");
return 0;
}
template <typename T>
T maxn(T *arr, int n)
{
T* value = &arr[0];
for (int i = 1; i < n; i++)
{
if (*value < arr[i])
value = &arr[i];
}
return *value;
}
template <> const char * maxn <const char *>(const char* arr[], int n)
{
const char* val = arr[0];
for (int i = 1; i < n; i++)
{
if (strlen(val) < strlen(arr[i]))
val = arr[i];
}
return val;
}
这是工作。祝你好运!