Encore une question tordue (stupide?):
Code 1:
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(){}
};
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)
   {
      this->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.
gcc ne compile pas le code 1:
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
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é).

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?