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:
Cela fonctionne, c'est normal, la définition du type _bar se trouvant avant sa concretisation.
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; };
Mais ceci fonctionne aussi, alors que je ne m'y attendais pas:
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
12
13
14 template<class _tString> struct A { typedef _tString String; class KFoo; }; template<class _tString> class A<_tString>::KFoo { public: String bar; };Ca ne me donne aucune erreur, ni de warning, ce qui m'arrange au passage.
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; }
Seulement j'aimerais savoir pourquoi ca fonctionne (testé sous GCC, VC8 et CodeWarrior Wii).
Merci pour quelques eclaircissements.
Partager