J'ai "découvert" un truc intéressant dont je n'aurais jamais cru que ca compile, mais ca fonctionne, donc j'aimerais savoir pourquoi.

Voici une defintion de type template et sa concretisation dans un template namespace:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
template<class _tString>
class _bar
{
public:
   _tString foo;
};
 
template<class _tString>
struct B
{
   typedef _tString String;
   typedef _bar<_tString> KBar;
};
Cela fonctionne, c'est normal, la définition du type _bar se trouvant avant sa concretisation.

Mais ceci fonctionne aussi, alors que je ne m'y attendais 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
template<class _tString>
struct A
{
   typedef _tString String;  
   class KFoo;
};
 
 
template<class _tString>
class A<_tString>::KFoo
{
public:
   String bar;
};
Le code de test:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
void test()
{
	//A test
	A<std::string>::KFoo foo;
	foo.bar = "test";
	std::cout << "A: << foo.bar << std::endl;
	//B test
	B<std::string>::KBar bar;
	bar.foo = "test";
	std::cout << "B: << bar.foo << std::endl;
}
Ca ne me donne aucune erreur, ni de warning, ce qui m'arrange au passage.
Seulement j'aimerais savoir pourquoi ca fonctionne (testé sous GCC, VC8 et CodeWarrior Wii).

Merci pour quelques eclaircissements.