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:

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;
}
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
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 ===|
Pour régler ce problème, à la ligne46 par exemples, j'ai du mettre:
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.