Bonsoir,
je suis actuellement en train de m'interesser au sujet de la "Métaprogrammation" (la lecture de l'article sur le Yes Engine m'a fait découvrir ce sujet :p) et j'essai donc d'implémenter les différents exemples qui sont présentés.
Le problème c'est que voilà, le code suivant (que je vais c/c) ne compilais pas:
Le problème est le suivant:
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
72
73
74
75 #include <iostream> class Vector { typedef double* iterator; typedef const double* const_iterator; public: Vector(double x, double y, double z) { element[0] = x; element[1] = y; element[2] = z; } iterator begin() { return element; } iterator end() { return element + 3; } double getX() { return element[0]; } double getY() { return element[1]; } double getZ() { return element[2]; } void setX(double x) { element[0] = x; } void setY(double y) { element[1] = y; } void setZ(double z) { element[2] = z; } private: double element[3]; }; enum Ops { Add, Minus, Const }; template <typename T, int Op> struct UnaryOp {}; template <typename T> struct UnaryOpBase { UnaryOpBase(T t) : It(t) {}; inline void operator ++() { ++It; } T It; }; template <typename T> struct UnaryOp<T, Minus> : public UnaryOpBase<T> { UnaryOp(T t) : UnaryOpBase<T>(t) {}; inline double operator *() { return -(*It); } }; template <typename T> struct UnaryOp<T, Const> : public UnaryOpBase<T> { UnaryOp(T t) : UnaryOpBase<T>(t) {}; inline void operator ++() {}; inline double operator *() { return It; } }; //! --- template <typename T, typename U, int Op> struct BinaryOp {}; template <typename T, typename U> struct BinaryOpBase { BinaryOpBase(T t, U u) : It1(t), It2(u) {}; inline void operator ++() { ++It1; ++It2; } T It1; U It2; }; template <typename T, typename U> struct BinaryOp<T, U, Add> : public BinaryOpBase<T, U> { BinaryOp(T t, U u) : BinaryOpBase<T, U>(t, u) {}; inline double operator *() { *It1 + *It2; } }; int main() { Vector v(1, 1, 1); return 0; }
Pour régler ce problème, à la ligne46 par exemples, j'ai du mettre:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9 Metaprogrammation-01\main.cpp||In member function `double UnaryOp<T, 1>::operator*()':| Metaprogrammation-01\main.cpp|46|error: `It' was not declared in this scope| Metaprogrammation-01\main.cpp||In member function `double UnaryOp<T, 2>::operator*()':| Metaprogrammation-01\main.cpp|52|error: `It' was not declared in this scope| Metaprogrammation-01\main.cpp||In member function `double BinaryOp<T, U, 0>::operator*()':| Metaprogrammation-01\main.cpp|69|error: `It1' was not declared in this scope| Metaprogrammation-01\main.cpp|69|error: `It2' was not declared in this scope| Metaprogrammation-01\main.cpp|69|warning: no return statement in function returning non-void| ||=== Build finished: 4 errors, 1 warnings ===|
inline double operator *() { return -(*UnaryOpBase<T>::It); }
au lieu de:
inline double operator *() { return -(*It); }
Or, dans l'exemple donné dans l'article ce n'est pas le cas. Quelqu'un peut-il m'expliquer pourquoi j'ai du expliciter la provenance de It ? Et sinon, quelqu'un a t-il une autre façon de procéder ?
Merci d'avance pour vos réponses, et bonnée soirée.![]()
Partager