Bonjour à tous,
Aujourd'hui j'ai un soucis avec l'utilisation des templates, voici d'abord mon code :
Matrix.h
Matrix.cpp (simplifié)
Code C++ : 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 #include <vector> #include <iostream> #ifndef MATRIX #define MATRIX template<typename T> class Matrix { private: std::vector<std::vector<T> > data; public: Matrix(); Matrix(int swidth, int sheight); Matrix(int size); int getWidth() { return data.size(); } int getHeight() { return data.size() == 0 ? 0 : data[0].size(); } void print(); ~Matrix(); }; #endif
Et enfin le main.cpp
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 #include "Matrix.h" /********************************* C O N S T R U C T O R S **********************************/ template<class T> Matrix<T>::Matrix(){ data.empty(); std::clog << "Construction matrice" << std::endl; } template<class T> Matrix<T>::Matrix(int swidth, int sheight) { data.resize(0); if(swidth > 0 && sheight > 0) { data.resize(swidth); for(unsigned int i = 0; i < data.size(); i++) { data[i].resize(sheight); } std::clog << "Construction matrice" << std::endl; } } template<class T> Matrix<T>::Matrix(int size) { if(size > 0) { data.resize(size); for(unsigned int i = 0; i < data.size(); i++) { data[i].resize(size); } } else { data.resize(0); } std::clog << "Construction matrice" << std::endl; } /********************************* O T H E R **********************************/ template<class T> void Matrix<T>::print() { int height; height = data.size() == 0 ? 0 : data[0].size(); std::cout << "Width = " << height << " height = "<< data.size() << std::endl; for(unsigned int i = 0; i < data.size(); i++) { for (unsigned int j = 0; j < data[i].size(); j++) { std::cout << data[i][j] << " "; } std::cout << std::endl; } } /********************************* D E S T R U C T O R **********************************/ template<class T> Matrix<T>::~Matrix() { data.resize(0); std::clog << "Destruction matrice" << std::endl; }
Voici ce me renvoie le compilateur (g++) :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8 #include <iostream> #include "Matrix.h" int main() { Matrix<int> m1(5); return 0; }
Code Console : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5 main.o: In function `main': /home/isen/Cours/C/perso/matrix/main.cpp:5: undefined reference to `Matrix<int>::Matrix(int)' /home/isen/Cours/C/perso/matrix/main.cpp:5: undefined reference to `Matrix<int>::~Matrix()' collect2: ld a retourné 1 code d'état d'exécution make: *** [matrix] Erreur 1
Il ne semble pas reconnaître les fonctions, cela ne marche pas non plus avec m1.print();. Je dois mal utiliser les templates mais même après avoir cherché je ne trouve pas de solutions.
PS : Si je n'écrit pas template<class T> void Matrix<T>::print()(...) dans le Matrix.cpp, le compilateur me cri dessus alors que cette fonction se moque royalement du type T. Je ne vois pas pourquoi je dois écrire cela.







Répondre avec citation
Partager