Bonjour à tous !
Je suis en train d'implémenter une classe de polynômes à coefficients dans un ensemble de nombres appartenant à un type prédéfini quelconque et possédant un nombre de variables quelconque.
Tout marche à peu près bien, mais j'ai quand même un problème avec une classe 'intermédiaire', la classe monome qui est une classe 'template' réutilisée par 'polynome' elle-même template' donc.
J'ai besoin de faire des sorties sur écran ou sur fichier, et j'utilise pour cela une méthode classique consistant à surcharger l'opérateur <<.
Voici mon problème:
Tout d'abord, le code ci-joint fonctionne:
Mais vous pouvez remarquer qu'il n'y a pas de protection des données, et pour cause, si je déclare les données membres privées, et que je fais une déclaration d'amitié pour l'opérateur surchargé. J'obtiens un warning et une erreur de linkage.
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
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70 #ifndef MONOME_H #define MONOME_H #include "exposant_multiple.h" template <typename T> class monome { public: T coefficient; exposant_multiple exposant; public: // constructeurs monome(); monome(T,exposant_multiple&); virtual ~monome(); monome& operator* (monome& other); monome& operator= (monome& other); }; template <typename T> monome<T>::monome() { //ctor } template <typename T> monome<T>::monome(T c,exposant_multiple& m) { //ctor coefficient=c; exposant=m; } template <typename T> monome<T>::~monome() { //dtor } // sortie sur écran ou sur fichier texte template <typename T> ostream& operator<< (ostream& os, monome<T>& M) { if (M.coefficient>0) os<<"+"; os<<M.coefficient; os<<M.exposant; return os; } template <typename T> monome<T>& monome<T>::operator* (monome<T>& other) { T coef= coefficient*other.coefficient; exposant_multiple* expo =new exposant_multiple((*this).exposant+other.exposant); monome<T>* result=new monome(coef,*expo); return *result; } template <typename T> monome<T>& monome<T>::operator= (monome<T>& other) { coefficient=other.coefficient; exposant=other.exposant; return *this; } #endif // MONOME_H
Voici une version du même fichier avec les passages incriminés en rouge et les messages d'erreur à la compilation.
Si quelqu'un peut m'expliquer ???
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
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71 #ifndef MONOME_H #define MONOME_H #include "exposant_multiple.h" template <typename T> class monome { private: T coefficient; exposant_multiple exposant; public: // constructeurs monome(); monome(T,exposant_multiple&); virtual ~monome(); monome& operator* (monome& other); monome& operator= (monome& other); friend ostream& operator<<(ostream&,monome&); }; template <typename T> monome<T>::monome() { //ctor } template <typename T> monome<T>::monome(T c,exposant_multiple& m) { //ctor coefficient=c; exposant=m; } template <typename T> monome<T>::~monome() { //dtor } // sortie sur écran ou sur fichier texte template <typename T> ostream& operator<< (ostream& os, monome<T>& M) { if (M.coefficient>0) os<<"+"; os<<M.coefficient; os<<M.exposant; return os; } template <typename T> monome<T>& monome<T>::operator* (monome<T>& other) { T coef= coefficient*other.coefficient; exposant_multiple* expo =new exposant_multiple((*this).exposant+other.exposant); monome<T>* result=new monome(coef,*expo); return *result; } template <typename T> monome<T>& monome<T>::operator= (monome<T>& other) { coefficient=other.coefficient; exposant=other.exposant; return *this; } #endif // MONOME_Htaire\Mes documents\bidon\polynomes\monome.h:19: warning: friend declaration `std::ostream& operator<<(std::ostream&, monome<T>&)' declares a non-template function
taire\Mes documents\bidon\polynomes\monome.h:19: warning: (if this is not what you intended, make sure the function template has already been declared and add <> after the function name here) -Wno-non-template-friend disables this warning
)]+0x37):: undefined reference to `operator<<(std::ostream&, monome<float>&)'
)]+0x55):: undefined reference to `operator<<(std::ostream&, monome<float>&)'
:: === Build finished: 2 errors, 2 warnings ===
Partager