1
votes

Pourquoi VS ne se termine-t-il pas automatiquement lorsque j'utilise des modèles?

Je travaille sur des structures de données en C ++ en utilisant des modèles et j'ai rencontré des problèmes.J'implémente un HashTable en utilisant le chaînage et j'ai également implémenté une liste liée.Le premier problème que j'ai rencontré était une erreur de lien avec mes définitions de modèle qui J'ai résolu le problème en incluant le fichier .cpp là où se trouvait la déclaration.

Maintenant, je suis tombé sur un autre problème et je ne sais pas s'il s'agit d'un problème lié aux modèles ou peut-être aux paramètres VS. , la construction du projet ne le met pas à jour sauf si je sauvegarde et compile mon point d'entrée pour une raison quelconque.J'ai lu quelques problèmes et les paramètres semblent corrects. Le problème le plus important que j'ai rencontré est que dans mon fichier Hashtable.cpp , j'ai des problèmes de saisie semi-automatique concernant UNIQUEMENT tout ce qui est lié à ma classe List .

Par exemple: J'ai utilisé List ** arr dans ma classe Hashtable et chaque fois que j'essaie d'utiliser l'une des méthodes de liste, par exemple arr [1] -> insert (100) non seulement il ne se termine pas automatiquement, mais il indique que la méthode appartient à comme je le montre sur la capture d'écran ci-dessous. Les déclarations ressemblent à ceci: Hashtable.h:

#pragma once
#include "Log.h"
#include "List.h"
#include <vector>
#include <iostream>

Hashtable.cpp : #include "Hashtable.h"

Et ma classe de liste n'a rien de spécial à part iostream etc

Je veux faites remarquer que le code ne se complète pas automatiquement mais qu'il fonctionne, qu'il exécute les bonnes méthodes, mais qu'il est vraiment inconfortable et ennuyeux de travailler avec.Je crains également que cela ne fonctionne pas sur un autre ordinateur, ce qui compte vraiment pour moi. Avez-vous une idée de ce qui pourrait ne pas aller?

La capture d'écran que j'ai mentionnée p >


4 commentaires

Les types dépendants sont difficiles à compléter automatiquement


@Galik Oui, ce serait en fait un moindre mal de tête que je n'ai pas envisagé.Ce ne serait pas difficile à mettre en œuvre.Je ne suis pas sûr que cela résoudra le problème de l'auto-complétion.


@YosokuDenkai Je viens de réaliser que vous n'utilisez pas std :: list mais votre propre classe, mais cela vaut la peine de le faire de cette façon. Ne vise pas à résoudre le problème de la saisie semi-automatique.


VS doit se compléter automatiquement dans ce scénario. Cela fonctionne pour moi pour std :: string et std :: vector (et pour mes modèles) donc je ne vois pas pourquoi votre modèle ne devrait pas être complété automatiquement . @GuillaumeRacicot note dans son scénario ce n'est pas de type dépendant. Espérons qu'en C ++ 20, les concepts deviendront utiles pour la saisie semi-automatique des types dépendants.


3 Réponses :


3
votes

La saisie semi-automatique est confuse par les modèles. Gardez à l'esprit que lorsqu'un compilateur compile du code temnplé, il sait quels seront les paramètres du modèle. En revanche, lorsque vous écrivez du code dans une classe basée sur un modèle, le système de saisie semi-automatique ne sait pas quel sera le paramètre.

Par exemple, si vous avez List ** arr et List a une méthode insert () , est arr [1] -> insérer (100) valide? Peut-être! ou peut être pas. Il peut y avoir une spécialisation de List pour un T particulier, qui n'a pas de méthode insert .

De plus, les systèmes de saisie semi-automatique ont tendance à être autant un art qu'une science, car ils doivent fonctionner à une vitesse interactive et doivent être robustes aux erreurs de syntaxe plus tôt dans le code. Les modèles les mettent à leur pire, car la syntaxe et la grammaire des modèles sont considérablement plus difficiles à obtenir que d'autres domaines de C ++, donc lorsque vous travaillez avec du code fortement basé sur des modèles, vous aurez tendance à voir la saisie semi-automatique agir à son pire.

Lorsque je travaille avec du code fortement basé sur des modèles, j'ai parfois "dé-modèle" le code tout en travaillant dessus simplement pour aider le compilateur. Les versions récentes de VS vous aideront en fait: les modèles que le compilateur trouve déroutants peuvent (généralement, mais pas toujours, et je ne sais pas pourquoi) vous offrir la possibilité de l'aider:

 entrez la description de l'image ici

Si vous cliquez sur cette icône , il vous sera demandé de lui donner un exemple d'un type avec lequel vous pourriez l'instancier, et d'utiliser ce type pour la saisie semi-automatique. Cela peut considérablement améliorer son efficacité.


1 commentaires

En fait, je ne le savais pas, c'est la première fois que je travaille beaucoup avec des modèles en plus de simples fonctions, etc.



0
votes
  1. Pouvez-vous confirmer si vous utilisez la fonctionnalité Microsoft Template Intellisense et si elle est activée?
  2. Certains de ces problèmes liés à la saisie semi-automatique ont été résolus / corrigés dans la version 15.8-preview5 - utilisez-vous une ancienne version de VS?
  3. Si le code fonctionne, je pense que vous devez vous assurer que votre environnement VS Code est corrigé avec tous les outils nécessaires en place.
  4. La portabilité de votre code C ++ ne devrait pas être un problème tant que votre environnement de compilation et toutes les dépendances sont conservés dans la bonne configuration ou un Makefile si nécessaire.

-SJ


2 commentaires

1 - Je ne peux pas vraiment le confirmer? Je ne suis pas sûr de ce que c'est puisque j'utilise beaucoup de modèles pour la première fois, je suppose que cela devrait être la valeur par défaut. 2 - J'utilise la dernière version 2017, pas la version VS2019 3 - J'ai vérifié et tout va bien.


1. Téléchargez la dernière version de Visual Studio 2018 ou 2019 selon le cas. Pour désactiver / activer la fonctionnalité, accédez à Outils> Options> C / C ++> Avancé> IntelliSense> Activer le modèle IntelliSense. 2. Vous pouvez consulter plus de détails sur la fonctionnalité Intellisense ici devblogs.microsoft.com/cppblog/...



2
votes

La version plus récente de Visual Studio a une fonctionnalité où vous pouvez sélectionner des types concrets pour instancier un modèle donné dans le but d'y avoir une saisie semi-automatique:

 entrez la description de l'image ici

Dans VS2017, vous devez les saisir manuellement. Dans VS2019, vous pouvez choisir parmi une liste d'instanciations réelles du modèle dans lequel vous vous trouvez.

Sans ces conseils, Intellisense n'a aucune chance de savoir ce que Hashtable a en termes de membres - vous auriez pu le spécialiser autant de fois que possible, arr pourrait ont n'importe quel type, et clear () pourrait renvoyer toutes sortes de choses en fonction de T . Toutes les suggestions qu'il donne peuvent être erronées pour un ensemble différent d'arguments de modèle ...


3 commentaires

Je remarque l'icône Visual Assist. Est-ce une fonctionnalité intégrée ou Visual Assist?


Il est intégré (et une raison majeure pour moi de ne pas utiliser le Visual Assist "intellisense" mais celui intégré).


Je n'ai pas encore mis à niveau vers VS2019, je suppose que cela vaut mon temps.Merci pour votre réponse