0
votes

Pourquoi les paramètres de modèle sont-ils nécessaires lors de la définition des fonctions des membres d'un modèle de classe en dehors de la classe?

Dans le code suivant, pourquoi dois-je écrire Someclass

:: incremblement () code>, au lieu de Someclass :: incrément () code>?

Ne devrait-il pas comprendre le compilateur, par lui-même, que soméclass code> est une classe de modèle qui prend code>? P>

template <typename Item>
struct someClass {
    void increment();
    Item x;
};

template <typename Item>
void someClass<Item> :: increment() {
    x++;
}


2 commentaires

Void Someclass :: Incrément () pourrait être une fonction de Someclass Espace de noms


Vous pouvez légitimement créer une version spécialisée: Modèle Void Someclass > :: incrément () ... . Ce n'est pas


3 Réponses :


2
votes

Etant donné que Someclass est une classe de modèle qui dépend d'un paramètre, des procédés et des attributs dépendent également de ce paramètre de modèle: xxx

pour chaque Item Il existe un corps de code différent pour incrément () . Éventuellement, la mise en page de soméclass dépend de élément , rendant x ++ Reportez-vous à un autre emplacement à l'intérieur Ceci .

Dans cet exemple particulier, élément n'est jamais utilisé directement pour que la langue puisse le faire implicitement. On pourrait soutenir que le code pouvait être fabriqué légèrement plus court. Il est fait avec CTAD , qui est beaucoup plus difficile. C'est une question d'opinion dans les rares cas où plusieurs lignes pouvaient être sauvées, que cela vaut la peine de compliquer la langue et d'ajouter un facteur surprise. Au moins avec CTAD, il y a des avantages. De nombreux programmeurs seront surpris de savoir que quelque chose qui ressemble à une classe normale est en fait une classe de modèle.

Le C ++ a déjà de nombreuses surprises de nombreuses surprises. On peut donc soutenir qu'une plus grande surprise n'est pas une grosse affaire. Tout se résume à une question d'opinion, pas de raison technique profonde pour nécessiter le paramètre de modèle explicite (et redondant) dans cet exemple. La politique est donc contre les opinions et favorise des faits, alors n'allez pas aller plus profond que cela.


3 commentaires

@Beeonrope en.cpprefreence.com/w/cpp/language/... classe Déduction de l'argument de modèle ou CTAD


Merci, une recherche Google a principalement tourné quelque chose à propos de Alzheimer.


@Beeonrope a ajouté un lien vers CTAD dans la réponse, pour le rendre propre



0
votes

Le compilateur ne devrait-il pas concrétiser, par lui-même, que soméclass code> est une classe de modèle qui prend code>? P>

Quand le compilateur voit le :: code>, il ne sait pas encore ce que vous êtes vraiment faire em>. Tout ce qu'il voit, c'est ce qui est à gauche de ce jeton. Donc, il voit un en-tête de modèle, suivi d'un nom typographique ( vide code>), suivi du nom d'un modèle de classe, suivi de l'opérateur de cadre ( :: code>). C'est tout. P>

Les modèles ne sont pas vraiment des choses existantes en C ++; Ils constituent un mécanisme de compilation pour Création de choses em>: classes, fonctions et variables en C ++ 14. Le nom du modèle Noms le modèle, mais le nom suivi de ses paramètres de modèle est ce qui crée réellement la chose que le modèle est destiné à créer. soméclass code> noms un modèle de classe; SOMECLASS CODE> Noms A EM> Classe em>, pas un modèle de classe. P>

et le nom des classes peut être suivi de :: code>. p>

Qu'est-ce que vous demandez essentiellement que le compilateur examine l'en-tête de modèle, voyez que le nom que vous avez donné le paramètre Modèle (S?) est identique au nom donné à Les paramètres de modèle du modèle soméclass code>, puis substituent automatiquement que dans. C'est juste non comment fonctionne C ++. Ce que vous demandez n'est pas très différent de s'attendre à ce que le compilateur remplisse les paramètres de fonction, simplement parce que le nom d'une variable sur le site d'appel se produit avec le nom d'un paramètre dans la fonction appelée. P> noms de paramètres, que la fonction ou le modèle, ne signifient pas em> en C ++. Ce sont juste des identificateurs; Ils ne comptent que dans le cadre de ce qui déclare ces noms. Les noms de paramètres de fonction ne comptent que dans la fonction définie. Et les noms de paramètres de modèle seulement comptent dans la portée de l'en-tête de modèle en question. P>

Votre classe utilise un élément de modèle différent de votre définition de membre. Donc, les noms ne comptent tout simplement pas jusqu'à C ++. Il est parfaitement valide pour le faire: P>

template <typename Foo>
void someClass<Foo>::increment() {
    x++;
}


0 commentaires

1
votes

Le compilateur ne devrait-il pas réaliser, par lui-même, que soméclass est un Classe de modèle qui prend ?

Pas nécessairement. Voici un exemple que N.M. mentionné dans un commentaire: considérez que soméclass a une spécialisation: xxx

maintenant, définissant le modèle de fonction Ceci: xxx

Comme vous pouvez le constater, les deux définitions ont le même modèle , mais ils diffèrent par Somlass <. ..> .


0 commentaires