[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 ! :D !
voila ma class :
Code:
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:
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:
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:
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:
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:
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:
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] );
} |
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 :aie: ... et bien faire les choses en séparant les fichiers... ma toute première foi... j'en suis tout ému :roll: :aie: 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... :king: 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:
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)
{
.../...
}
:(
.../.... |