Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1935 connectés 

  FORUM HardWare.fr
  Programmation
  C++

  Problème avec les Templates sous Visual !

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

Problème avec les Templates sous Visual !

n°914728
nathan_g
Posté le 04-12-2004 à 15:16:08  profilanswer
 

Re-bonjour,
 
J'ai de plus en plus d'étonnement, au fur et à mesure que j'utilise Visual. Maintenant le code seuivant ne compile pas :
 
[cpp ]
 
#include <list>
 
using namespace std;
 
class MathFunc
{
 public:
  MathFunc();
 
  template <class T>
   static list<T> identique(list<T> maliste);
 
 protected:
};
 
template <class T>
list<T> MathFunc::identique(list<T> maliste)
{
 return (maliste);
}
 
class Article
{
 public:
  Article();
 
 protected:
  int _val;
};
 
 
int main()
{
 int i;
 
 list<Article> liste0,liste1;
 
 liste1 = MathFunc::identique(liste0);
 
 return(0);
}
 
[ /cpp]
 
En fait, la simple compilation du programme sans l'édition de lien me gènère ce message d'erreur :
 
Compiling...
main.cpp
 
e:\chemin\main.cpp(42) : error C2893: Failed to specialize function template 'class std::list<T,class std::allocator<T> > __cdecl MathFunc::identique(class std::list<T,class std::allocator<T> > )'
        With the following template arguments:
        'class Article'
Error executing cl.exe.
 
main.obj - 1 error(s), 0 warning(s)
 
La ligne 42 correspond à :
 
[cpp ]
 
liste1 = MathFunc::identique(liste0);
 
[ /cpp]
 
Sauriez vous d'ou vient ce problème propre à Visual (je le redit "propre à Visual", car comme pour le précédent problème que j'ai rencontré il y a quelques jours, ce type de programme marche parfaitement sous Linux avec gcc) ? Est ce qu'il manque qqch dans les options de compilations ?

mood
Publicité
Posté le 04-12-2004 à 15:16:08  profilanswer
 

n°914730
nathan_g
Posté le 04-12-2004 à 15:16:48  profilanswer
 

Bon, visiblment l'utilisation des balises cpp n'a pas fonctionné. J'ai du aussi rater qqch de cd coté la !

n°914734
Taz
bisounours-codeur
Posté le 04-12-2004 à 15:21:20  profilanswer
 

change de compilateur

n°914746
hellbilly
free smile
Posté le 04-12-2004 à 15:46:43  profilanswer
 

t'as quelle version de visual ?
 
avec le 7.1 y aucun problème.

n°914750
nathan_g
Posté le 04-12-2004 à 15:52:37  profilanswer
 

Oui, mais j'ai la version 6.0 (pour Visual C++).
Je ne sais pas pourquoi, mais je crois connaitre ta réponse, à savoir que ma version est à changer (ce qui n'est pas possible dans les conditions où je travaille).

n°914755
Taz
bisounours-codeur
Posté le 04-12-2004 à 15:58:23  profilanswer
 

ben alors tu te tappes l'instanciation explicite et voilà

n°914758
hellbilly
free smile
Posté le 04-12-2004 à 16:02:46  profilanswer
 

nathan_g a écrit :

Oui, mais j'ai la version 6.0 (pour Visual C++).
Je ne sais pas pourquoi, mais je crois connaitre ta réponse, à savoir que ma version est à changer (ce qui n'est pas possible dans les conditions où je travaille).

VC 6 est pas vraiment le compilateur ideal pour faire du c++. Installe le dernier service pack, ca passera peut etre.

n°914760
nathan_g
Posté le 04-12-2004 à 16:04:27  profilanswer
 

Excuse moi taz, mais qu'est ce que tu entends par "instanciation explicite" ?
Est ce que tu suggère de ne pas mettre cette méthode " identique " en inline mais dans un fichier .cpp et de le compiler à part (ce qui ne doit pas être possible ici étant donné son type).
 
Ou alors, d'enlever le caractère template de la méthode en la redéfinisant pour chaque classe pour laquelle elle est utiliser ? Ainsi, je créerait une méthode
 
list<Article> identique(list<Article> maliste);  
 
et, si besoin est :
 
list<Machin> identique(list<Machin> maliste);  
list<Truc> identique(list<Truc> maliste);  
list<Bidule> identique(list<Bidule> maliste);  
 
Bonjour la réutilisabilité ...

n°914761
nathan_g
Posté le 04-12-2004 à 16:05:19  profilanswer
 

Le service pack SP2 de XP ?

n°914763
hellbilly
free smile
Posté le 04-12-2004 à 16:08:48  profilanswer
 

nathan_g a écrit :

Le service pack SP2 de XP ?


euh nan de visual c++
 
http://www.microsoft.com/downloads [...] layLang=fr

mood
Publicité
Posté le 04-12-2004 à 16:08:48  profilanswer
 

n°914770
Taz
bisounours-codeur
Posté le 04-12-2004 à 16:15:59  profilanswer
 

ben avec les fonctions template, y a de la déduction du types des arguments. Chose que ne fait pas vc++6. donc il faut expliciter les arguments tempalte

n°914772
nathan_g
Posté le 04-12-2004 à 16:19:14  profilanswer
 

Si j'explicite les arguments teplate, je ne fais plus de template ! Donc, je perds le caractère réutilisable de mes méthodes templates. Non ?

n°914774
Taz
bisounours-codeur
Posté le 04-12-2004 à 16:20:30  profilanswer
 

[:heink]
 
retourne au début de ton cours alors, ça vaudra mieux

n°914781
nathan_g
Posté le 04-12-2004 à 16:28:46  profilanswer
 

Est ce que t peux juste me donner la façon dont tu écrirais la définition de ma méthode identique (ou son appel) en explicitant les arguments, comme tu l'écrit ? Précédemment, j'avais donc :
 
template <class T>  
list<T> MathFunc::identique(list<T> maliste)  
{  
 return (maliste);  
}  
 
et, pour la ligne qui bloque la compilation :
 
liste1 = MathFunc::identique(liste0);
 
Ce serait plus parlant, pour le débutant que je suis, d'avoir juste un exemple du type de correction que tu proposes.

n°914785
Taz
bisounours-codeur
Posté le 04-12-2004 à 16:31:57  profilanswer
 

liste1 = MathFunc::identique<  list<machin> >(liste0);  
 
si t'as sauté le chapitre sur l'instanciation des template, c'est pas la peine de demander pourquoi je fais ça :)

n°914796
nathan_g
Posté le 04-12-2004 à 16:40:15  profilanswer
 

Mouais ...
Je viens d'essayer de juste remplacer :
 
liste1 = MathFunc::identique(liste0);  
 
par :
 
liste1 = MathFunc::identique<  list<Article> >(liste0);  
 
Mais maintenant j'ai un message différent :
 
e:\chemin\main.cpp(43) : fatal error C1001: INTERNAL COMPILER ERROR
        (compiler file 'msc1.cpp', line 1794)  
         Please choose the Technical Support command on the Visual C++  
         Help menu, or open the Technical Support help file for more information
Error executing cl.exe.
 
Et cette nouvelle syntaxe de ligne n'est pas acceptée par gcc sous Linux (la précédente l'était pourtant).

n°914804
masklinn
í dag viðrar vel til loftárása
Posté le 04-12-2004 à 16:50:45  profilanswer
 

Taz a écrit :

liste1 = MathFunc::identique<  list<machin> >(liste0);  
 
si t'as sauté le chapitre sur l'instanciation des template, c'est pas la peine de demander pourquoi je fais ça :)


Ce serait plutôt
liste1 = MathFunc::identique<machin> (liste0) :o
 
Vu qu'il passe le type contenu dans sa liste pour créer son template, et pas la liste typée :o  
 
(sinon liste1 va être une list<list<machin>> si je me plante pas)


---------------
Stick a parrot in a Call of Duty lobby, and you're gonna get a racist parrot. — Cody
n°914806
Taz
bisounours-codeur
Posté le 04-12-2004 à 16:52:27  profilanswer
 

ah si j'ai pas vu.
mais ça a permis à vc++ de se vautrer comme une merde tout ça ...

n°914812
nathan_g
Posté le 04-12-2004 à 17:00:44  profilanswer
 

Bon ...
 
L'utilisation de :
 
liste1 = MathFunc::identique< Article >(liste0);
 
me donne toujours l'erreur :
 
Compiling...
main.cpp
e:\chemin\main.cpp(43) : fatal error C1001: INTERNAL COMPILER ERROR
        (compiler file 'msc1.cpp', line 1794)  
         Please choose the Technical Support command on the Visual C++  
         Help menu, or open the Technical Support help file for more information
Error executing cl.exe.
 
main.obj - 1 error(s), 0 warning(s)
 
Mais, c'est vrai que ce type d'écriture (que je connaissais pas mea culpa !) marche parfaitement sous Linux et gcc (Heureusement !).

n°914817
Taz
bisounours-codeur
Posté le 04-12-2004 à 17:03:54  profilanswer
 

ben compilateur de merde
 
si tu as
template<typename T> void foo(T);
 
quant tu écris
foo(3.14f);
 
ton compilateur DOIT déduire/résoudre
foo<float>(3.14f);
 
afin d'instancier la bonne fonction.
Les deux écritures sont donc équivalentes, l'une étant implicite. l'implicite à du bon, parce que ton type peut être assez compliqué à exprimer. On se sert souvent de ce genre de fonction comme sucre syntaxique.

n°914827
nathan_g
Posté le 04-12-2004 à 17:16:46  profilanswer
 

ben compilateur de merde  
 
=> Je crois que c'est un bon résumé de ce problème.

n°915714
nathan_g
Posté le 06-12-2004 à 13:52:47  profilanswer
 

Finalement, on m'a indiqué un moyen de faire marcher ma méthode template, c'est de faire une classe template. Ainsi, le code suivant est accepté par Visual C++ 6.0 :
 
#include <list>
 
using namespace std;
 
template <class T>
class MathFunc
{
 public:
 
  MathFunc();
 
         static list<T> identique(list<T> maliste);
 
 protected:
 
};
 
template <class T>
list<T> MathFunc<T>::identique(list<T> maliste)
{
 return (maliste);
}
 
class Article
{
 public:
 
  Article();
 
 protected:
 
  int _val;
};
 
int main()
{
 list<Article> liste0,liste1;
 
 liste1 = MathFunc<Article>::identique(liste0);
         
        return(0);
}

mood
Publicité
Posté le   profilanswer
 


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  C++

  Problème avec les Templates sous Visual !

 

Sujets relatifs
[PHP] Problème de POSTProblème de création de vignette !
C++ : Problème de "commandes"[CSS] Problème d'alignement d'un menu dans un div
select et socket enrobé de sucre (fdopen mode lecture) -> probleme ???[Oracle - PL/SQL] Problème de trigger et de table inaccessible
Realiser un lien avec Visual C++Problème réalisation d'un puissance 4 sous Word
problème pour trouver des infos claires sur c++ et gtk[HTML/CSS] Simple probleme d agrandissement...
Plus de sujets relatifs à : Problème avec les Templates sous Visual !


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR