Bonjour, j'avais déjà créé un post sur la virtualisation de méthodes template ici.
Et maintenant que j'ai les infos qu'il me faut j'ai donc poursuivi la chose (donc ceci est la suite en quelque sorte de mon ancien post)
J'ai donc créer une classe Variable:
Variable.h
Variable.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 #ifndef DEF_VARIABLE #define DEF_VARIABLE #include "../All.cpp" class Variable { // Constructeur public: Variable(); Variable(int); Variable(Variable const& v); template<typename T> Variable(T n); // Attributs public: private: typeVar type; boost::any val; protected: // Méthodes public: virtual void incremente(); virtual void decremente(); virtual std::string toString(); virtual std::string typeNameToString(); virtual unsigned int getMemorySize(); }; #endif
Et voici main.cpp qui test cette classe:
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 #include "../All.cpp" #include "Variable.h" using namespace std; Variable::Variable(){ }// TEMP : TODO Variable::Variable(int i){ }// TEMP : TODO Variable::Variable(Variable const& v) { }// TEMP : TODO template<typename T> Variable::Variable(T n){ val=n; if(typeid(n)==typeid(int)){ cout << "int!" << endl; type=i_int; } else if(typeid(n)==typeid(unsigned int) || typeid(n)==typeid(uint)){ cout << "uint!" << endl; type=i_uint; } else if(typeid(n)==typeid(char)){ cout << "char!" << endl; type=i_char; } else if(typeid(n)==typeid(unsigned char) || typeid(n)==typeid(uchar)){ cout << "unsigned char!" << endl; type=i_uchar; } else { cout << "? ? ?" << endl; type=i_notype; } } void Variable::incremente(){}// TEMP : TODO void Variable::decremente(){}// TEMP : TODO string Variable::toString(){ return "NoValue"; // TEMP : TODO } string Variable::typeNameToString(){ return "NoValue"; // TEMP : TODO } unsigned int Variable::getMemorySize(){ return sizeof(*this); // TEMP : TODO }
Et voila le message du compilo (gcc) :
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 #include "All.cpp" using namespace std; int main() { new Variable(); new Variable((int)5); new Variable((char)5); // plante #ifdef DEBUG_TIMERS cout << endl <<"Temps d'execution (ms): "<< clock() << endl; #endif return returnCode; }
undefined reference to `Variable::Variable<char>(char)'
Pourtant le constructeur existe et il est accessible puisque les 2 lignes au dessus de celle qui plante fonctionnent.
D'où vient le problème svp?
Partager