forward declaration sous template
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:
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:
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:
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.