template, héritage virtuel: gcc vs Visual II
Encore une question tordue (stupide?):
Code 1:
Code:
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:
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:
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?