Accueil > Forum > > > > Pb de syntaxe avec une methode template d'une classe template.
Pb de syntaxe avec une methode template d'une classe template.
jeudi 4 décembre 2008 à 19:32:41 |
Pb de syntaxe avec une methode template d'une classe template.

gaspos
|
Bonjour, voici une classe template dont l'une des méthode a un type template en plus : template <class type1> struct foo { // première methode sans type template supplementaire // dont l'implementation est donnée plus bas int func1 ( type1 & x ) ;
// deuxième methode avec un type template supplementaire (type2) // dont le code est inline template <class type2> int func2 ( type1 & x , type2 & y ) { return( sizeof( x )+sizeof( y ) ) ; }
// troisième methode avec un type template supplementaire (type2) // dont l'implementation est donnée plus bas template <class type2> int func3 ( type1 & x , type2 & y ) ; } ;
// implementation de la première méthode : OK  template <class type1> int foo<type1>::func1 ( type1 & x ) { return( sizeof( x )*2 ) ; }
// implementation de la troisème méthode :KO ! template <class type1,class type2> int foo<type1>::func3<type2> ( type1 & x , type2 & y ) { return( sizeof( x )*sizeof( y ) ) ; }La partie implémentation de func3 ne compile pas... C'est la première fois que je me retrouve dans cette situation, et je n'ai pas la moindre idée de la syntaxe qui convient pour déclarer ce genre de chose. La méthode func2 qui est déclarée en inline compile sans problème. La méthode func1 qui n'a pas de type inline supplementaire aussi. Si quelqu'un a une idée pour func3, je suis preneur ! Pour info, je compile avec Visual C++ 2005. Peut-être est-ce lui le coupable...  Merci d'avance Gaspos
|
|
vendredi 5 décembre 2008 à 00:59:49 |
Re : Pb de syntaxe avec une methode template d'une classe template.

mezaya
|
La 3eme fonction s'implémente comme ça : template template int foo::func3( type1 & x , type2 & y ) { return( sizeof( x )*sizeof( y ) ) ; }
|
|
vendredi 5 décembre 2008 à 01:02:03 |
Re : Pb de syntaxe avec une methode template d'une classe template.

mezaya
|
désolé pour le formatage
template <class type1>
template <class type2>
int foo<type1>::func3( type1 & x , type2 & y )
{
return( sizeof( x )*sizeof( y ) ) ;
}
|
|
vendredi 5 décembre 2008 à 14:37:50 |
Re : Pb de syntaxe avec une methode template d'une classe template.

gaspos
|
Wow ! Super merci !  En fait j'avais trouvé la réponse dans l'excellent "c++ template, the complete guide" de Vandervoorde et Josuttis aux éditions Addison-Wesley. Mais bien sûr, l'arbre cachait la forêt. Voici le challange de niveau 2, la même chose avec une fonction friend : template <typename Value> class foo { public: template <typename output> friend output & operator<< ( output & o , const foo & t ) //  ça marche ! { o << t.i ; return( o ) ; } private: Value i ; } ; Mais comment déporter la définition de l'operateur << comme on l'a fait pour fonc3  Gaspos
|
|
vendredi 5 décembre 2008 à 21:21:42 |
Re : Pb de syntaxe avec une methode template d'une classe template.

mezaya
|
un peu plus dur cette fois ;)
dans ta class foo tu déclare ta free fonction comme étant friend :
template <class type1> struct foo
{
// définition de ta classe ....
template<class type1, class output>
friend output& operator<< (output& o , foo<type1>& f);
}
puis du implémente ta fonction comme ceci :
template<class type1, class output>
output& operator<< (output& o, foo<type1>& f)
{
o << f.i;
return o;
}
et Voila...
|
|
lundi 8 décembre 2008 à 18:05:57 |
Re : Pb de syntaxe avec une methode template d'une classe template.

gaspos
|
Merci de ta prompte réponse ! J'avais déjà pensé à cette syntaxe mais ça ne marche pas :
Avec ce code :
template <typename Value> class foo { public: template <typename output> friend output & operator<< ( output & o , const foo & t ) ; private: Value i ; } ; template <typename Value,typename output> output & operator<< ( output & o , const foo<Value> & t ) { o << t.i ; // ERREUR : ne peut accéder à un membre privé return( o ) ; } le compilo me renvoie l'erreur en rouge au dessus. Tout s'explique avec cette tentative :
template <typename Value> class foo { public: template <typename output> friend output & operator<< ( output & o , const foo & t ) { // implémentée ici o << t.i ; return( o ) ; } private: Value i ; } ; template <typename Value,typename output> output & operator<< ( output & o , const foo<Value> & t ) { // et encore une fois ici --> on devrait avoir une erreur ! o << t.i ; return( o ) ; } J'ai toujours la même erreur alors que je m'attendais à ce que le compilo me dise que l'opérateur << était déjà implementé. J'en conclue qu'il ne fait pas le lien entre la déclaration de la fonction amie au sein de la classe et celle implémentée plus bas. Ce qui explique l'erreur : il ne sait pas que cette fonction est celle qui avait désignée comme amie et du coup, interdit l'accès aux membres privés.
Ce qui est encore plus bizarre, c'est que si, dans la première version du code, on vire le "private", ça marche et l'operateur << est bien invoqué. Ce qui signifie que dans ce cas là, le compilo sait bien aller chercher cette fonction.
Il faudrait essayer avec gcc pour voir si c'est un pb d'implementation de la norme c++ par Crimosoft...
Hadrien
|
|
mercredi 10 décembre 2008 à 00:19:25 |
Re : Pb de syntaxe avec une methode template d'une classe template.

mezaya
|
Réponse acceptée !
il y a une erreur dans ton code il faut définir les 2 classes du templates. ça marche j'ai essayé sur Visual 2008.
à la définition de la classe c'est pas :
template <typename output>
friend output & operator<< ( output & o , const foo & t ) ;
mais :
template <typename Value, typename output> // il faut redéfinir template Value
friend output & operator<< ( output & o , const foo & t ) ;
|
|
lundi 15 décembre 2008 à 19:03:26 |
Re : Pb de syntaxe avec une methode template d'une classe template.

gaspos
|
Mais bon sang, mais c'est bien sûr ! L'opérateur << n'est pas une méthode de la classe, donc il n'hérite pas de son paramètre de template. Du coup, ça marche dans mon code aussi ! Je m'en vais publier ce code sous peu (qui est enfin présentable grâce à toi).  Le fait est que c'est un peu étrange cette déclaration de fonction amie depuis l'interieur de la déclaration d'une classe. encore merci ! Hadrien
|
|
Cette discussion est classée dans : int, methode, type, template, méthode
Répondre à ce message
Sujets en rapport avec ce message
template [ par dam1234 ]
G un probleme avec une methode de classe declaree en template. J'aurai besoin de savoir comment est ce que l'on fait pour connaitre quel a été le type
type de variable? long int ? [ par dleewax ]
salut! je suis nouveau dans le C++ et j'ai un petit problème... je suis en train de faire un petit programme permettant de calculer les factorielles..
Conversion de CString vers Int [ par DARKSIDIOUS ]
Bonjour à tous,J'ai un problème qui me turlupine depuis quelques heures : comment fait-on pour convertir des données d'une variables de type CString v
convertir des chaine en type int [ par super ienien ]
comment convertit on des chaine de type char en type entier ou inversementmeci d'avance
Une fonction multi-type ? [ par TeLeTUbIz ]
Ouah !!!J'ai cherché, scruté dans tout les coins, soulevé les montagnes,... mais je ne trouve pas solution à mon problème.En fait, je voudrais faire u
comment tester un type de donné en C++ [ par Armandopoulos ]
Salut !!en VC++Je voudrai bien savoir comment tester un type de donné (par ex. int , float , long , char) entré par l utilisateur au clavier.J ai pens
Variable int sur le disque... [ par nullspace ]
Je cherche à enregistrer et lire sur le disque par ofstream et ifstream à partir de variables de type int.Seulement il m'écrit sous format texte.En vb
aidez moi svp [ par asnow ]
Q'un aurait-il la gentillesse de me traduire ce code, en algorithme. merci d'avance.int i=0;int x=random(10);int y=random(10);int type_pos=random(2);i
Renvoie de type int& [ par saturne_1606 ]
Bonjour a tous!Voila g la fonction suivante:int& tableau::operator ()(int l, int c){ if ((l>=tab.size())||(c>=(tab[l]).size())) {
fonction apply / template [ par pointejb ]
Bonjour à tous,Je cherche un moyen d'implémenter une fonction de type 'apply' qui prendrait en parametres une fonction et ses arguments et qui aurait
Livres en rapport
|
Derniers Blogs
[DESIGN PATTERNS] PARTIE 2: DIP: DEPENDENCY INVERSION PRINCIPLE[DESIGN PATTERNS] PARTIE 2: DIP: DEPENDENCY INVERSION PRINCIPLE par tja
C'est le dernier principe des principes du Design Orienté Objet (The Principles of Object Oriented Design) fondés par Robert C. Martin plus connu sous le pseudonyme d'Uncle Bob.
l'image empruntée de LosTechies.
Je ne traite pas les principes dans...
Cliquez pour lire la suite de l'article par tja TECHDAYS PARIS 2010 : SHAREPOINT 2010 POUR LES DéVELOPPEURSTECHDAYS PARIS 2010 : SHAREPOINT 2010 POUR LES DéVELOPPEURS par ROMELARD Fabrice
Animé par: Laurent Cotton Le développement dans SharePoint 2010 passe par plusieurs axes qui seront évoqués dans cette session, mais plus particulièrement les développements simples lié au besoin Business Business Connectivity Services Ce BCS es...
Cliquez pour lire la suite de l'article par ROMELARD Fabrice TECHDAYS PARIS 2010 : PLEINIèRE DERNIER JOURTECHDAYS PARIS 2010 : PLEINIèRE DERNIER JOUR par ROMELARD Fabrice
Cette session est la dernière pleinière de ces 3 jours de TechDays Paris 2010. Généralement, cette troisième journée est plus axée sur l'avenir vu par Microsoft. Après un retour sur l'avenir vu par la Science Fiction ou par ...
Cliquez pour lire la suite de l'article par ROMELARD Fabrice UNE JOLIE-HORLOGE ET PAS QU'UN PEU !UNE JOLIE-HORLOGE ET PAS QU'UN PEU ! par neodante
Pour les possesseurs d'iPhone, ça y est Bijin Tokei - qui se traduit littéralement en Français par " Jolie Horloge " - est arrivé et GRATUITEMENT s'il vous plaît ! Après la version Tokyo, Hokkaido, night club, racing, Gal, "pour les mademoiselles'", . voi...
Cliquez pour lire la suite de l'article par neodante TECHDAYS PARIS 2010 : CONNECTEZ VOS DONNéES à SHAREPOINT 2010 AVEC LES BUSINESS CONNECTIVITY SERVICESTECHDAYS PARIS 2010 : CONNECTEZ VOS DONNéES à SHAREPOINT 2010 AVEC LES BUSINESS CONNECTIVITY SERVICES par ROMELARD Fabrice
Animé par: Gaetan Bouveret et Julien Chomarat Business Connectivity Services (BCS) est dans SharePoint 2010 la version 2 de Business Data Catalog (BDC dans SharePoint 2007). Il s'agit de la solution permettant de visualiser des données provenan...
Cliquez pour lire la suite de l'article par ROMELARD Fabrice
Forum
RE : WIN APIRE : WIN API par omarino_007
Cliquez pour lire la suite par omarino_007
Logiciels
DB-MAIN (9.1.0)DB-MAIN (9.1.0)DB-MAIN is a data-modeling and data-architecture tool. It is designed to help developers and anal... Cliquez pour télécharger DB-MAIN Xilisoft DPG Convertisseur (5.1.37.0120)XILISOFT DPG CONVERTISSEUR (5.1.37.0120)Xilisoft DPG Convertisseur offre aux fans de Nintendo DS une bonne solution leur permettant de dé... Cliquez pour télécharger Xilisoft DPG Convertisseur GraphicsGale (2.01.01)GRAPHICSGALE (2.01.01)GraphicsGale est un logiciel de PixelArt avec de nombreuse fonctionnalités permettant de réalisé ... Cliquez pour télécharger GraphicsGale Architecte 3D (Platinum 2010)ARCHITECTE 3D (PLATINUM 2010)Architecte 3D Platinium vous permet de concevoir facilement les plans votre future maison, de l'é... Cliquez pour télécharger Architecte 3D TeamViewer 5 (TeamViewer 5)TEAMVIEWER 5 (TEAMVIEWER 5)Dépanner un ami,expliquer une manipulation devient un jeu d'enfant.
Prise en main d'un autre ord... Cliquez pour télécharger TeamViewer 5
|