7 votes

Intellisense ne fonctionne pas avec les modèles VS2012 ultimate c++

Intellisense fonctionne très mal avec mon VS...

Lorsque je code en C++, il fonctionne à 100%, jusqu'à ce que je commence à utiliser des modèles, puis il cesse complètement de fonctionner, ne détecte plus les erreurs et ne s'autocomplète plus dans tous les cas.

Je suis enclin à croire que cela a à voir avec quelque chose que j'ai fait avec mon code qui l'a cassé.

J'ai donc commencé par créer une classe contenant une structure :

template<typename T>
class List<T>
{
private:
    struct Node
    {
        T value;
        Node* next;
        Node* previous;
    };
    Node* First;
    Node* Last;
...
};

plus tard, je déclare quelques fonctions supplémentaires :

template<typename T>
inline T List::First()
{
    return First;
}

jusqu'ici tout va bien, intellisense fonctionne à 100%, mais si j'essaie de faire first-> ça ne marche pas, VS ne me donne aucune option (ctrl + espace ne fonctionne pas).

De plus, si je tape des bêtises, il ne me dit pas que c'est faux :

sdkjgisjdga->vsrsiib = 123jgi;

Je ne sais pas vraiment ce qu'il faut faire pour régler ce problème.

Merci pour votre temps et vos efforts.

PS : J'ai déjà essayé de réinitialiser les configurations.

EDIT : J'ai oublié de dire que si je n'utilise pas de modèles dans mon fichier .h, intellisense fonctionne correctement.

8voto

MSalters Points 74024

Les modèles doivent être instanciés avant que l'on puisse dire définitivement ce qu'ils contiennent. Par exemple, votre First-> pointe vers un List<T>::Node et cela dépend évidemment de l'exacte T .

Bien sûr, Intellisense dans ce cas simple pourrait lister sans ambiguïté les membres en substituant simplement T==int pendant un moment. Mais réfléchissez à ce qui est pire : Intellisense ne connaissant pas les membres (comme maintenant) ou Intellisense se trompant dans les cas difficiles où vous en avez le plus besoin ?

8voto

RhetoricalRuvim Points 220

Je suis un peu en retard avec cette réponse, et peut-être que l'OP ne travaille plus sur ce code, mais je pense que cela peut encore aider quelqu'un qui cherche des modèles et IntelliSense.

Une chose que vous pouvez essayer - si vous voulez être en mesure de voir vos fautes de frappe et vos erreurs pendant que vous tapez, mais si vous voulez que votre code soit modélisable - est d'utiliser un #if-#else-#endif :

#if MY_USE_TEMPLATES 
template <typename T> 
#else 
typedef [**your-test-type-here**] T; 
#endif 
class List { 
... your code here ... 
} 

Dans Visual Studio 2015, cela semble fonctionner. Vous pouvez définir MY_USE_TEMPLATES à 0 (à l'aide d'un #define), développer votre code avec IntelliSense et auto-complétion, etc. (afin de faire moins d'erreurs), puis changer MY_USE_TEMPLATES à 1 lorsque vous êtes prêt à tester ou compiler avec du code de modèle réel.

Si vous avez activé MY_USE_TEMPLATES, le code qui fait référence à votre liste produira une erreur (c'est-à-dire un code comme 'List myList'), et vous pouvez résoudre ce problème avec un 'template' fictif supplémentaire dans l'instruction #else. Cependant, l'avantage de laisser la clause #else sans "template" supplémentaire est que l'erreur que vous obtenez en référençant votre liste peut vous rappeler d'activer MY_USE_TEMPLATES avant de tester le code, réduisant ainsi la probabilité d'un bug. (L'expérience suggère qu'il est facile d'oublier quand on manipule beaucoup de choses et de grands projets ...)

Il faut cependant faire attention à l'utilisation de plusieurs définitions de type de ce type : le "typedef .... T' ne peut être utilisé en toute sécurité qu'une seule fois pour le nom "T" ; alors que vous pouvez utiliser 'typedef ... TYPE1' pour une classe et 'typedef ... TYPE2 " pour une autre, vous ne peut pas utiliser en toute sécurité le même nom de type pour différents types, sauf si vous placez les différents noms de type dans des espaces de noms distincts. (J'ai essayé cela dans Visual Studio 2015).

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X