Ce que je fais est la question 6 du chapitre 8 sur C++ Primer Plus
Cela nécessite de créer deux modèles de fonctions, un pour les tableaux doubles int et un autre modèle qui utilise char*[]
int et double ne posent aucun problème. sur celui en particulier pendant longtemps. Je ne sais pas pourquoi il ne peut pas être compilé. Ensuite, je l'ai réécrit en utilisant une fonction normale et j'ai découvert qu'il pouvait fonctionner normalement. Ensuite, après avoir travaillé dessus pendant longtemps et toujours. ne fonctionne pas, j'ai cherché des réponses en ligne et j'ai découvert que j'avais écrit la même réponse
Le format est fondamentalement le même. Il ne peut tout simplement pas être compilé
.
[]>' de 'const char maxn(const char, int)' ne correspond à aucun modèle de déclaration de modèle< ; >const char maxn<const char[]>(const char* x[], int n)
Code :
#include <cstring>
#include <iostream>
using namespace std;
template<typename T>T maxn(T x, int n);
template<>const char* maxn<const char*[]>(const char* x[], int n);
/*
* 模板函数针对不同类型数组 输出数组中最大的那个值
*/
int main(int argc, char** argv) {
int ix[6] = {34, 12, 343, 1, 43, 31};
double dx[4] = {1.34, 1231.2, 34.3, 44.23};
const char* sx[5] = {"abcde", "fedcba", "abcdefg", "12345", "qwert"};
cout << "ix[6] max: " << *maxn(ix, sizeof ix / sizeof ix[0]) << endl;
cout << "dx[4] max: " << *maxn(dx, sizeof dx / sizeof dx[0]) << endl;
cout << "sx[5] max_address: " << (int*) maxn(sx, 5) << endl;
cout << "Press Enter To Exit..." << endl;
cin.get();
return 0;
}
//这个是我自己写的普通函数,能运行
//const char* maxn(const char* x[5],int n) {
// const char* max_len = x[0];
// for (int i = 0; i < n-1; i++) {
// max_len = strlen(max_len) >= strlen(x[i + 1]) ? max_len : x[i + 1];
// }
// return max_len;
//}
template<>const char* maxn<const char*[]>(const char* x[], int n)
{
const char* max_len = x[0];
for (int i = 0; i < n - 1; i++) {
max_len = strlen(max_len) >= strlen(x[i + 1]) ? max_len : x[i + 1];
}
return max_len;
}
template<typename T>
T maxn(T x, int n) {
for (int i = 0; i < n - 1; i++) {
x[i + 1] = x[i] > x[i + 1] ? x[i] : x[i + 1];
}
return x + n - 1;
}
Déclaration :
template<> const char **maxn(const char **x, int n);
template<> const char **maxn(const char **x, int n);
调用:
cout << "sx[5] max_address: " << (int*)*maxn(sx, 5) << endl;
定义:
你犯了三个错误:
特化语法不对
特化时两处T的类型不一致
多处指针没有解引用
思路:
模板声明:
template<typename T> T maxn(T x, int n);
调用:
maxn(sx, 5)
。其中变量sx的类型是const char *[5]
,即数组类型。由于sx是数组类型,模板形式参数的形式是
T
,这里sx会被隐式转换成指针类型(array to pointer conversion)const char **
,即T是const char **
。所以特化应当是
Appel :template<> const char **maxn(const char **x, int n);
cout << "sx[5] max_address : " << (int*)*maxn(sx, 5) <<
🎜Idée :🎜 🎜Déclaration de modèle :
template<typename T> T maxn(T x, int n);
Appel :
maxn(sx, 5)
. Le type de variable sx estconst char *[5]
, qui est un type tableau. 🎜 🎜Puisque sx est un type de tableau, le paramètre formel du modèle est sous la forme deT
, où sx sera implicitement converti en type pointeur (conversion tableau en pointeur)const char ** code>, c'est-à-dire que T est
const char **
. 🎜 🎜La spécialisation devrait donc êtretemplate<> const char **maxn(const char **x, int n);
🎜 🎜PS : Intuitivement, il devrait y avoir une spécialisation de la version de référence. Mais comme T ne peut pas déduire le type référence, aucune spécialisation de la version référence n’est appelée ici. Bien entendu, vous pouvez fournir des paramètres de modèle pour appeler cette spécialisation. 🎜D'après ma compréhension, la fonction maxn devrait renvoyer l'élément "le plus grand" dans un tableau de longueur n, donc je pense que la déclaration de fonction devrait être écrite comme ceci :
Suivez cette instruction, modifiez votre implémentation et elle sera compilée.
Le code suivant est simplement modifié en fonction de votre code original et compilé dans vs2017 pour référence :
Vous avez écrit la mauvaise version spéciale.
Posture correcte :