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 :

Template- Pb fonction friend err : non-template function


Sujet :

C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    89
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2007
    Messages : 89
    Par défaut [Debutant]Template- Pb fonction friend err : non-template function
    Bonjours a tous;

    Je suis en train de me faire un petit script de calcul matriciel dynamique... et la je seche... j'ai pas mal de modifications en cours.. d'ou certaine lourdeur et inutilité diverse... mais l'erreur qui me stress concerne une fonction amie de generation aleatoire de matrice que le compialteur trouve en non-template alors que je pensais l'avoir bien specifiée...

    ps : y'a surement enormement d'erreur, j'ai bien avancé mais y'a encore du taf... et cette erreur me bloque un peu... si quelqu'un pouvais jetter un petit coup d'oeil je lui serais grandement reconnaissant ! !

    voila ma class :

    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
    //definition d'une structure matricielle en template
    //contenant un pointeur de pointeur de type Template
                //but : allouer un tableau de pointeur de l ligne
                //      contenant l'adresse d'un tableau de Telmt de c colonne
                //acces naturel comme un tableau multidimensionnel
    template <typename Telmt>
    struct Mat
    {
         Telmt ** mat;
    };
    
    
    // definition de la classe matrice en template
                //taille -> tableau prenant en premier le nombre de ligne
                //                          en deuxieme le nombre de colonne, ordre naturel !
                //A pointeur de type Telmt vers ma structure mat
    template <typename Telmt> class matrice
    {
          int taille[2];
          Mat<Telmt> * A;
    
          public:
    
                matrice();
                matrice(int, int);
                matrice( const matrice &);
                ~matrice();
                void saisie(int , int, Telmt);
                void generer();
                void afficher();
                Telmt donnee( int, int);
                friend matrice operator+( matrice &, matrice &);   /<<<---
                friend matrice operator*( matrice &, matrice &);    /<<<--- ce sont ces deux là quie me renvoie un warning... 8O    
    
    };
    la fonction qui me stressssssss :

    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
     
    template<class Telmt> matrice<Telmt> operator+( matrice<Telmt> &M1, matrice<Telmt> &M2)
    {
          if ( M1.taille[0] == M2.taille[0] && M1.taille[1] == M2.taille[1] )
          {
                matrice<Telmt> S( M1.taille[0], M1.taille[1] );
     
                for (int l = 0; l < M1.taille[0]; l++)
                {
                      for (int c = 0; c < M1.taille[1]; c++)
                      {
                            S.saisie( l, c, (M1.donnee( l, c) + M2.donnee( l, c)) );
                      }
                }
                return S;
          }
          else cout << " On additionne des matrices de taille identique, arrete de jouer ! " << endl;
     
    }
    La fonction saisie

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    template <typename Telmt> void matrice<Telmt>::saisie( int ligne, int colonne, Telmt valeur)
    {
          cout << "fonction membre saisie ---- " << endl;
          A->mat[ligne][colonne] = valeur;
          //dbg(3)
    }
    Les constructeurs :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    template <typename Telmt> matrice<Telmt>::matrice()
    {
          cout << "constructeur par defaut ----" << endl;
          taille[0] = 0;
          taille[1] = 0;
          A = NULL;
          dbg(1)
    }
    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
     
     
    template <typename Telmt> matrice<Telmt>::matrice( int ligne, int colonne)
    {
          cout << " constructeur l/c specifie ----" << endl;
          taille[0] = ligne;
          taille[1] = colonne;
          dbg(2) cout << "Test ligne/colonne : " << taille[0] << " , " << taille[1] << endl;
          A = new Mat<Telmt>;
          A->mat = new Telmt *[(taille[0])];dbg(21)
          if (A->mat != NULL)
          {
                for (unsigned short l = 0; l < taille[0]; l++)
                      A->mat[l] = new Telmt [(taille[1])];
                cout << " Allocation d'une matrice de " << taille[0] << " ligne(s) et de " << taille[1] << " colonne reussi !!." << endl;
     
                for (unsigned short l = 0; l < taille[0]; l++)
                {
                      for (unsigned short c =0; c < taille[1]; c++) A->mat[l][c]=0;
                }
          }
          else cout << " A->mat NULL ... " << endl;
          dbg(22)
    }
    Le constructeur par copie :

    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
    template <typename Telmt> matrice<Telmt>::matrice( const matrice<Telmt> & M)
    {
          cout << " Entree dans le constructeur par copie ----" << endl;
          taille[0] = M.taille[0];
          taille[1] = M.taille[1];
    
          if ( M.A == NULL )
                A = NULL;
          else
          {
                A = new Mat<Telmt>;
                A->mat = new Telmt *[taille[0]];
    
                for (unsigned short l = 0; l > taille[0]; l++)
                      A->mat[l] = new Telmt [taille[1]];
    
                if ( A != NULL)
                {
                      for (unsigned short l=0; l < taille[0]; l++)
                            for (unsigned short c = 0; c < taille[1]; c++)
                                  saisie( l, c, M.donnee( l, c ) );   //   <<<<<<<-------      erreur !!!
                }
                else cout << " mauvaise allocation constr copie\n";
          }
          cout << " sortie constructeur par copie ! " << endl;
    }
    fonction donnee

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    //fonction membre recuperation donnee
    template <typename Telmt> Telmt matrice<Telmt>::donnee( int ligne, int colonne)
    {
          return ( A->mat[ligne][colonne] );
    }

  2. #2
    Expert confirmé

    Inscrit en
    Novembre 2005
    Messages
    5 145
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 5 145

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    89
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2007
    Messages : 89
    Par défaut merci pour la rapidité de la réponse
    J'ai voulu prendre le temps de décortiquer un peut tout ça... et puis entre temps je suis repartit sur un autre plus dans la manip des chaines de caractères... je joue a : j'apprend a faire des classes ... et bien faire les choses en séparant les fichiers... ma toute première foi... j'en suis tout ému comme si j'avais pas suffisament de pb avec ces fonctions qui ont la class d'avoir des amies template spécialisé ou non arg... et je reprend celui là, donc....

    En bref : Corrigez moi si je me trompe...


    ma surchage de l'opérateur + ; que j'ai peut être maladroitement mis en fonction amie, faisons comme si on avais rien vu, le principe reste valable pour toute autre fonction, non?, elle est template, elle dépendra bien du type de l'objet manipulé, non ?.

    mais j'avoue que pour ces histoire de :
    spécialisation de fonctions template de meme prototype que la fonction non template
    surcharge de fonctions template avec une fonctions non template
    etc....

    j'ai un peu, voir beaucoup ... de mal avec la subtilité justement... je pensais être pas mal avec

    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
     
    template <typename Telmt> class matrice
    {
          int taille[2];
          Mat<Telmt> * A;
     
          public:
    .../...etc
                friend matrice operator+( matrice &, matrice &);
                friend matrice operator*( matrice &, matrice &);
     
    };
     
    template<class Telmt> matrice<Telmt> operator+( matrice<Telmt> &M1, matrice<Telmt> &M2)
    {
    .../...
    }
     
    :(
    .../....

Discussions similaires

  1. Réponses: 2
    Dernier message: 15/09/2014, 11h51
  2. Réponses: 3
    Dernier message: 09/04/2009, 11h30
  3. Réponses: 3
    Dernier message: 08/07/2008, 15h06
  4. friend surcharge classe template
    Par fridollin dans le forum Langage
    Réponses: 4
    Dernier message: 15/11/2005, 21h37
  5. Problèmes de fonctions membres de classe templates, gcc3.3.6
    Par yves.dessertine dans le forum Autres éditeurs
    Réponses: 12
    Dernier message: 17/10/2005, 21h36

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