spécialisation de fonctions membres (template) d'une classe template

spécialisation de fonctions membres (template) d'une classe template - C++ - Programmation

Marsh Posté le 10-01-2005 à 15:24:43    

Bonjour,
 
Comme énoncé dans le sujet, le code suivant (pour l'exemple) ne compile pas (sous gcc-3.3.3, gcc-3.3.4 et gcc-3.4.3) :
 

Code :
  1. template <class T>
  2. struct A
  3. {
  4.     template <int N>  int f();
  5. };
  6. template <class T>
  7. template <>
  8. int A<T>::f<0>()
  9. {
  10.     return 1;
  11. }
  12. template <class T>
  13. template <int N>
  14. int A<T>::f()
  15. {
  16.     return N * f<N-1>();
  17. }


 
Si la classe A n'est pas un modèle, ça fonctionne bien sur.
Voila, je soumet ce probleme à votre sagacité, je sèche.
Merci.


Message édité par ++fab le 10-01-2005 à 15:25:51
Reply

Marsh Posté le 10-01-2005 à 15:24:43   

Reply

Marsh Posté le 10-01-2005 à 19:42:56    

Houla, ce genre d'exemple pousse les compilos C++ dans leurs derniers retranchements là.  
 
Je n'ai jamais essayé ce genre de code, mais une fonction template dans un template de classe, je ne suis pas sûr que ce soit possible.

Reply

Marsh Posté le 10-01-2005 à 19:49:39    

el muchacho a écrit :

Houla, ce genre d'exemple pousse les compilos C++ dans leurs derniers retranchements là.  
 
Je n'ai jamais essayé ce genre de code, mais une fonction template dans un template de classe, je ne suis pas sûr que ce soit possible.


 
une fonction template dans une classe template, ça ne pose aucun probleme.
une spécialisation devrait passer normalement ...  
fais chier  :o  
 
 

Reply

Marsh Posté le 10-01-2005 à 19:52:22    

Taz va bien trouver la solution ... ;)

Reply

Marsh Posté le 10-01-2005 à 20:14:38    

pour info, sous Visual C++ 2003, ça déclenche l'erreur suivante :
 

Citation :


error C2768: 'A<T>::f' : utilisation non conforme d'arguments de modèle explicite


 


[Compiler Error C2768]
 
'fonction' : utilisation non conforme d'arguments de modèle explicite
 
Le compilateur n'a pas pu déterminer si une définition de fonction devait être une spécialisation explicite d'un modèle de fonction ou si la définition de fonction devait être une nouvelle fonction.
 
Cette erreur a été introduite dans Visual Studio .NET 2003, avec les améliorations de conformité du compilateur.
 
Pour plus d'informations, consultez Summary of Compile-Time Breaking Changes.
 
L'exemple suivant génère l'erreur C2768 :
 
// C2768.cpp
// compile with: /LD
template<typename T>
void f(T)
{
}
 
// template<>
void f<int>(int)
// Uncomment the template<> line to make an explicit specialization or
// try the following to make a global nontemplate function overload
// void f(int)
{   // C2768
}



---------------
J'ai un string dans l'array (Paris Hilton)
Reply

Marsh Posté le 10-01-2005 à 20:17:39    

ben c'est pas légal, voilà tout

Reply

Marsh Posté le 10-01-2005 à 20:57:36    

mouais

Reply

Marsh Posté le 10-01-2005 à 22:12:08    

Taz a écrit :

ben c'est pas légal, voilà tout


 
Taz, y a t'il un point précis du standard qui infirme la validité de ce code ?
J'ai trouvé nulle part.

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed