IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C++ Discussion :

class avec plusieurs paramètres template, et fonction amie


Sujet :

C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre habitué
    Inscrit en
    Novembre 2010
    Messages
    11
    Détails du profil
    Informations personnelles :
    Âge : 45

    Informations forums :
    Inscription : Novembre 2010
    Messages : 11
    Par défaut class avec plusieurs paramètres template, et fonction amie
    Bonjour,

    Me revoilà avec un problème à peine différent de celui que j'ai posté ici il y a quelques jours, et pourtant, malgré mes recherches, je suis bien en peine pour trouver la solution tout seul...

    J'ai deux classes conteneurs très proches :
    - L'une est à taille statique : sa capacité lui est passée par un paramètre template lors de l'instanciation, elle ne peut donc plus jamais varier ensuite. Le template de cette class prend donc deux paramètres : le type d'objet à contenir, et la capacité du conteneur.
    - L'autre est à taille dynamique : la capacité du conteneur varie au cour de la vie d'une instance. Le template de la classe prend donc un seul et unique paramètre : le type d'objet à contenir.

    Lorsque ces deux conteneurs possèdent le même type d'objet, j'aimerai pouvoir les concaténer et renvoyer le résultat dans un conteneur dynamique. Et je voudrai faire ça avec une fonction libre, amie des deux classes à la fois.

    Malheureusement, je ne trouve pas la syntaxe adéquate, aucune de mes tentatives ne compile (Borland c++builder 6). Quelqu'un à une idée ?


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
     
    template <class Objet, int Taille> class ConteneurStatique;
    template <class Objet> class ConteneurDynamique;
     
    template <class Objet, int Taille>
    const ConteneurDynamique<Objet> Add (const ConteneurDynamique<Objet> &DynamicData, const ConteneurStatique<Objet, Taille> &StaticData) {
      ConteneurDynamique<Objet> Result;
      // ... utilise les données protégées des arguments pour déterminer Result ...
      return Result;
    }
     
    template <class Objet, int Taille>
    class ConteneurStatique {
      public:
        // Ok
        friend const ConteneurDynamique<Objet> Add<> (const ConteneurDynamique<Objet> &DynamicData, const ConteneurStatique<Objet, Taille> &StaticData);
      protected:
        Objet Data[Taille];
    };
     
    template <class Objet>
    class ConteneurDynamique {
      public:
        // E2401 Invalid template argument list
        template <int Taille>
        friend const ConteneurDynamique<Objet> Add<> (const ConteneurDynamique<Objet> &DynamicData, const ConteneurStatique<Objet, Taille> &StaticData);
     
      protected:
        Objet *Data;
    };
     
     
    int main(int argc, char *argv[]) {
      ConteneurDynamique<int> Data1;
      ConteneurStatique<int, 10> Data2;
      ConteneurDynamique<int> R = Add (Data1, Data2);
      return 0;
    }

  2. #2
    Membre expérimenté
    Homme Profil pro
    Analyse système
    Inscrit en
    Novembre 2008
    Messages
    227
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Analyse système
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Novembre 2008
    Messages : 227
    Par défaut
    J'ai jeté un oeil à ton code pourquoi met tu sans le <> chez moi sa compile.

  3. #3
    Membre habitué
    Inscrit en
    Novembre 2010
    Messages
    11
    Détails du profil
    Informations personnelles :
    Âge : 45

    Informations forums :
    Inscription : Novembre 2010
    Messages : 11
    Par défaut
    Parce que c'est la syntaxe qui va bien

    Du moins, pour la déclaration d'amitié de Add avec la class ConteneurStatique, le Add<> ou Add<Objet> est obligatoire sinon ca compile pas chez moi. Je te renvoie aux réponses qui m'ont été données sur le sujet :
    http://www.developpez.net/forums/d10...fonction-amie/

    T'as vérifié si tu pouvais vraiment acceder au membre Data de chaque argument ? C'est quoi ton compilateur ?

  4. #4
    Membre Expert

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2007
    Messages
    1 895
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Septembre 2007
    Messages : 1 895
    Par défaut
    friend ... Add<Objet,Taille> ?

    Sur .Net 2010, ça compile, mais va savoir pour Borland C++ Builder 6... Ce compilateur n'est pas vraiment reconnu pour son support correct des standard. En fait, il compile un dialecte du C++, pas du C++.

    Peut-être faudrait-il voir avec la communauté Borland ? (si une telle communauté existe, bien sûr).
    [FAQ des forums][FAQ Développement 2D, 3D et Jeux][Si vous ne savez pas ou vous en êtes...]
    Essayez d'écrire clairement (c'est à dire avec des mots français complets). SMS est votre ennemi.
    Evitez les arguments inutiles - DirectMachin vs. OpenTruc ou G++ vs. Café. C'est dépassé tout ça.
    Et si vous êtes sages, vous aurez peut être vous aussi la chance de passer à la télé. Ou pas.

    Ce site contient un forum d'entraide gratuit. Il ne s'use que si l'on ne s'en sert pas.

  5. #5
    Membre habitué
    Inscrit en
    Novembre 2010
    Messages
    11
    Détails du profil
    Informations personnelles :
    Âge : 45

    Informations forums :
    Inscription : Novembre 2010
    Messages : 11
    Par défaut
    ca marche pas non plus malheureusement

    Si vraiment builder respecte si peu la norme que tu le dis, il est temps que je le change. Mais je suis complètement perdu, et c'est frustrant de devoir laisser la programmation de coté pour passer du temps a choisir un soft et à s'adapter à son interface. Ca fera surement l'objet d'un post un de ces quatre.

    En attendant, merci à tous les deux de vous être penché sur mon problème.

  6. #6
    Inactif  


    Homme Profil pro
    Inscrit en
    Novembre 2008
    Messages
    5 288
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Secteur : Santé

    Informations forums :
    Inscription : Novembre 2008
    Messages : 5 288
    Par défaut
    La solution la plus simple serait encore de ne pas utiliser l'amitié...

    Il suffit de mettre une fonction back_insert dans ta classe ConteneurDynamique, en publique, qui auraient pour fonction d'ajouter des éléments à la fin du conteneur puis de créer une fonction Add qui appellerait cette fonction back_insert.

    Au fait, boost::array pour ton tableau statique ?

  7. #7
    Membre Expert

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2007
    Messages
    1 895
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Septembre 2007
    Messages : 1 895
    Par défaut
    Citation Envoyé par sleepless Voir le message
    ca marche pas non plus malheureusement

    Si vraiment builder respecte si peu la norme que tu le dis, il est temps que je le change. Mais je suis complètement perdu, et c'est frustrant de devoir laisser la programmation de coté pour passer du temps a choisir un soft et à s'adapter à son interface. Ca fera surement l'objet d'un post un de ces quatre.

    En attendant, merci à tous les deux de vous être penché sur mon problème.
    Le problème étant que si tu te sers des librairies livrées avec, tu risques d'avoir des problèmes.

    C'est bien Borland C++ Builder 6.0 ? Si c'est le cas, alors le compilateur est effectivement très daté. Dr. Dobbs, en 2003, a évalué sa correspondance au coeur du standard à 92%, lorsque les autres compilateurs du marché oscillait entre 96 et 99% (98% pour Visual C++ 7.1). Pour comparaison, Visual C++ 6.0, compilateur pré-standard, était à 83% sur le même test.

    Les compilateurs récents s'étant encore amélioré, il devient fortement en retard.

    Bien évidemment, le point d'achoppement des compilateurs est souvent les templates. Si on veut jouer avec eux correctement, il faut un compilateur récent.

    Cependant, comme je le disais en introduction, tu risques fort d'avoir des problèmes.

    Il existe pourtant une solution simple : changer le design de tes classes, et passer par des itérateurs - comme le fait la librairie standard. Ou utiliser boost - dont certaines parties fonctionnent correctement sur BC++ (à noter que ce compilateur ne bénéficie pas vraiment du meilleur support qui soit; il est même très en retard sur les autres compilateurs).
    [FAQ des forums][FAQ Développement 2D, 3D et Jeux][Si vous ne savez pas ou vous en êtes...]
    Essayez d'écrire clairement (c'est à dire avec des mots français complets). SMS est votre ennemi.
    Evitez les arguments inutiles - DirectMachin vs. OpenTruc ou G++ vs. Café. C'est dépassé tout ça.
    Et si vous êtes sages, vous aurez peut être vous aussi la chance de passer à la télé. Ou pas.

    Ce site contient un forum d'entraide gratuit. Il ne s'use que si l'on ne s'en sert pas.

Discussions similaires

  1. class template et fonction amie
    Par sleepless dans le forum C++
    Réponses: 5
    Dernier message: 19/11/2010, 13h37
  2. Appel d'une fonction avec plusieurs paramètres
    Par kazarn dans le forum Général JavaScript
    Réponses: 7
    Dernier message: 06/06/2009, 18h55
  3. créer une fonction avec plusieurs paramètres
    Par SHERPAE dans le forum Macros et VBA Excel
    Réponses: 4
    Dernier message: 06/01/2009, 17h41
  4. Aide pour déclarer fonction avec plusieurs paramètres de sortie
    Par tonioj41 dans le forum Macros et VBA Excel
    Réponses: 10
    Dernier message: 16/01/2008, 11h06
  5. [Système] Fonction avec plusieurs paramètres optionnels
    Par cerede2000 dans le forum Langage
    Réponses: 1
    Dernier message: 25/05/2007, 14h36

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo