recherche

Maison  >  Questions et réponses  >  le corps du texte

c++ - Matérialisation du modèle de fonction. Je débogue depuis 1 heure. J'ai essayé tous les moyens et les réponses standard sont correctes, mais elles ne peuvent pas être compilées.

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é
.

Message d'erreur : main.cpp:43:23 : Erreur : L'identifiant de modèle 'maxn<const char

[]>' 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;
}
高洛峰高洛峰2753 Il y a quelques jours654

répondre à tous(3)je répondrai

  • PHP中文网

    PHP中文网2017-05-16 13:29:45

    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;

    定义:

    template<>
    const char **maxn(const char **x, int n)
    {
        const char **max_len = x;
        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;
    }

    你犯了三个错误:

    • 特化语法不对

    • 特化时两处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 **

    所以特化应当是
    template<> const char **maxn(const char **x, int n);

    Appel : cout << "sx[5] max_address : " << (int*)*maxn(sx, 5) <<

    Définition : 🎜 rrreee 🎜Vous avez commis trois erreurs : 🎜
    • 🎜Syntaxe de spécialisation incorrecte🎜
    • 🎜Les deux types T sont incohérents lors de la spécialisation🎜
    • 🎜De nombreux pointeurs ne sont pas déréférencés🎜

    🎜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 est const 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 de T, où sx sera implicitement converti en type pointeur (conversion tableau en pointeur) const char **, c'est-à-dire que T est const char **. 🎜 🎜La spécialisation devrait donc être
    template<> 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. 🎜

    répondre
    0
  • PHP中文网

    PHP中文网2017-05-16 13:29:45

    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 :

    template<typename T>T maxn(T x[], int n);
    template<>const char* maxn<const char*>(const char* x[], int n);
    

    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 :

    template<typename T>T maxn(const T x[], int n);
    template<>const char* maxn<const char*>(const char* const x[], int n);
    
    template<>const char* maxn<const char*>(const char* const 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(const 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];
    }
    

    répondre
    0
  • 漂亮男人

    漂亮男人2017-05-16 13:29:45

    Vous avez écrit la mauvaise version spéciale.

    template<>const char* maxn<const char*[]>(const char* x[], int n);

    Posture correcte :

    const char* maxn(const char* x[], int n);

    répondre
    0
  • Annulerrépondre