Encore une question tordue (stupide?):
Code 1:
Code 2:
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 template<class TElement> class A { public: A(){} virtual ~A(){} virtual void MaMethode(void)=0; }; template<class TElement> class B :virtual public A<TElement> { public: B(){} virtual ~B(){} virtual void MonAutreMethode(void) { MaMethode(); } }; class D {}; class C :public B<D>, virtual public A<D> { public: C(){} virtual ~C(){} virtual void MaMethode(){} };
Visual compile très bien les deux codes.
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 template<class TElement> class A { public: A(){} virtual ~A(){} virtual void MaMethode(void)=0; }; template<class TElement> class B :virtual public A<TElement> { public: B(){} virtual ~B(){} virtual void MonAutreMethode(void) { this->MaMethode(); } }; class D {}; class C :public B<D>, virtual public A<D> { public: C(){} virtual ~C(){} virtual void MaMethode(){} };
gcc ne compile pas le code 1:
Par intuition, ce comportement ne me choque pas trop: difficulté à résoudre l'instanciation de A::MaMethode sans le paramètre template. (mais, comme c'est du ressenti intuitif, le vocabulaire est certainement inapproprié).
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 In member function `virtual void B<TElement>::MonAutreMethode()': error: there are no arguments to `MaMethode' that depend on a template parameter, so a declaration of `MaMethode' must be available
Là où je n'arrive plus à comprendre, c'est pourquoi alors réussit-il à compiler code 2? J'ai toujours pensé que {MaMethode();} et {this->MaMethode();} étaient deux façons d'écrire la même chose. Apparemment, non. Quelle est la différence?
Partager