Vous ne trouvez pas de réponse à votre problème ? Alors posez la question dans le forum. Souvenez-vous qu'il n'y a jamais de question bête, mais rester dans l'ignorance parce que l'on n'ose pas poser une question, ça c'est une erreur !

Sujet : Pb de syntaxe avec une methode template d'une classe template. [ Divers / Général ] (gaspos)

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é 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


Nos sponsors

Sondage...

CalendriCode

Janvier 2009
LMMJVSD
   1234
567891011
12131415161718
19202122232425
262728293031 

Consulter la suite du CalendriCode

Téléchargements

Logiciels à télécharger sur le même thème :



Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel BAÏSE, Merci à Vincent pour ses précieux conseils
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés
Temps d'éxécution de la page : 0,218 sec

Google Coop CodeS-SourceS Google Coop CodeS-SourceS


Certaines images présentes sur le site (notament certains avatars) sont issues des collections IconShock, donc si vous souhaitez utiliser ces icons vous devez les acheter, ne les copiez pas et ne utilisez pas dans vos sites et applications sans les avoir commandé.