frenchtoucco a écrit :
mais dans ton exemple, si on supprime les .template et ->template le code compile quand même , Y a des cas ou sans .template, la compilation passe pas il me semble
|
De memoire, il n'est autorise que quand il est obligatoire en C++03. De memoire toujours, en C++0X on relachera un peu cette contrainte.
Il y a (eu?) des compilateurs n'implementant par la recherche de noms en deux temps qui ignoraient purement et simplement ces indications aux endroits ou elles etaient autorisees grammaticalement sans verifier qu'elle etait autorisee semantiquement. Et chez eux, les virer compile toujours.
Exemple complet et compilable (mais plutot stupide) ou ce devrait etre obligatoire (ce l'est pour gcc 4.3.3 et pour comeau http://www.comeaucomputing.com/tryitout/)
Code :
- template <typename T>
- int f(T x)
- {
- typename T::result r = x.template g<int>(42);
- return r;
- }
- struct X
- {
- typedef int result;
- template <typename T> T g(T x) { return x; }
- };
- #include <iostream>
- #include <ostream>
- int main()
- {
- X x;
- std::cout << f(x) << '\n';
- return 0;
- }
|
Message édité par Un Programmeur le 06-02-2009 à 14:41:35