Problème avec les Templates sous Visual ! - C++ - Programmation
Marsh Posté le 04-12-2004 à 15:16:48
Bon, visiblment l'utilisation des balises cpp n'a pas fonctionné. J'ai du aussi rater qqch de cd coté la !
Marsh Posté le 04-12-2004 à 15:46:43
t'as quelle version de visual ?
avec le 7.1 y aucun problème.
Marsh Posté le 04-12-2004 à 15:52:37
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).
Marsh Posté le 04-12-2004 à 15:58:23
ben alors tu te tappes l'instanciation explicite et voilà
Marsh Posté le 04-12-2004 à 16:02:46
nathan_g a écrit : Oui, mais j'ai la version 6.0 (pour Visual C++). |
VC 6 est pas vraiment le compilateur ideal pour faire du c++. Installe le dernier service pack, ca passera peut etre.
Marsh Posté le 04-12-2004 à 16:04:27
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é ...
Marsh Posté le 04-12-2004 à 16:08:48
nathan_g a écrit : Le service pack SP2 de XP ? |
euh nan de visual c++
http://www.microsoft.com/downloads [...] layLang=fr
Marsh Posté le 04-12-2004 à 16:15:59
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
Marsh Posté le 04-12-2004 à 16:19:14
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 ?
Marsh Posté le 04-12-2004 à 16:28:46
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.
Marsh Posté le 04-12-2004 à 16:31:57
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
Marsh Posté le 04-12-2004 à 16:40:15
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).
Marsh Posté le 04-12-2004 à 16:50:45
Taz a écrit : liste1 = MathFunc::identique< list<machin> >(liste0); |
Ce serait plutôt
liste1 = MathFunc::identique<machin> (liste0)
Vu qu'il passe le type contenu dans sa liste pour créer son template, et pas la liste typée
(sinon liste1 va être une list<list<machin>> si je me plante pas)
Marsh Posté le 04-12-2004 à 16:52:27
ah si j'ai pas vu.
mais ça a permis à vc++ de se vautrer comme une merde tout ça ...
Marsh Posté le 04-12-2004 à 17:00:44
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 !).
Marsh Posté le 04-12-2004 à 17:03:54
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.
Marsh Posté le 04-12-2004 à 17:16:46
ben compilateur de merde
=> Je crois que c'est un bon résumé de ce problème.
Marsh Posté le 06-12-2004 à 13:52:47
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);
}
Marsh Posté le 04-12-2004 à 15:16:08
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 ?