erreur de spécialisation d'un template ...

erreur de spécialisation d'un template ... - C++ - Programmation

Marsh Posté le 20-01-2006 à 18:17:49    

Bonjour à tous,
 
Je travail sous XCODE v2.2 (OS X 10.4.4) et Visual C++ v6 (Windows XP SP2)
 
Sous XCODE, le compilateur me donne l'erreur suivante  : "error: specialization of 'template<class_Tp> struct std::greater' in different namespace" / le Visual est lui beaucoup plus "permissif" ;-)
 
Le code est le suivant : j'effectue un tri avec l'utilisation de list::sort(x) ou 'x' est une fonction de comparaison de type std::greater() qui me permet de comparer un membre de type std::string contenu dans mes instances de classe.
 
La voici :
 

Code :
  1. template <> struct std::greater<CMyClass *>
  2. {
  3. bool operator()(const CMyClass *poA, const CMyClass *poB) const
  4. {
  5.  return (poA && poB) ? (poA->m_oText.compare(poB->m_oText) <= 0 ? true : false) : false;
  6. }
  7. };


 
J'ai du mal à comprendre l'erreur donnée par le compilateur. Quelqu'un a-t-il déjà été confronté à ce type de problème et comment le résoudre ?
 
Merci d'avance pour vos réponses.

Reply

Marsh Posté le 20-01-2006 à 18:17:49   

Reply

Marsh Posté le 20-01-2006 à 18:40:56    

je n'ai jamais été confronté au problème
mais l'erreur semble assez claire
 

Code :
  1. namespace std
  2. {
  3.     template<> struct greater<CMyClass*> : public binary_function<CMyClass*, CMyClass*, bool>
  4.     {
  5.      bool operator()(const CMyClass* x, const CMyClass* y) const
  6.      {
  7.       //blah
  8.      }
  9.     };
  10. }


 
il me semble aussi que Visual 2005 est beaucoup moins permissif que g++ 3.4.2 par exemple

Reply

Marsh Posté le 20-01-2006 à 18:55:58    


Code :
  1. namespace std
  2. {
  3.     //...
  4. }


Illégal. Tu peux avoir de sacrés blagues avec ça ...
 

fra0 a écrit :

il me semble aussi que Visual 2005 est beaucoup moins permissif que g++ 3.4.2 par exemple


gni ???

Reply

Marsh Posté le 20-01-2006 à 19:20:49    

intéressant, d'après ta théorie les headers standard  sont "illégaux" ?

Reply

Marsh Posté le 20-01-2006 à 19:26:10    

ma théorie ?

Reply

Marsh Posté le 20-01-2006 à 19:28:12    

ton assertion si tu préfères

Reply

Marsh Posté le 20-01-2006 à 19:31:36    

et bien simplement "écrire" dans le namespace std est réservé à l'implémentation.

Reply

Marsh Posté le 20-01-2006 à 19:32:55    

et qu'est-ce que notre ami essaie de faire à ton avis ?

Reply

Marsh Posté le 20-01-2006 à 19:42:04    

il essaye de se retenir d'écrire dans le namespace std peut-etre ?

Reply

Marsh Posté le 20-01-2006 à 19:52:17    

dans ce cas il ne devrait pas se retenir de déclarer cette fonction en tant que membre de CMyClass
ou de CMyClassComparator

Reply

Marsh Posté le 20-01-2006 à 19:52:17   

Reply

Marsh Posté le 20-01-2006 à 21:13:59    

Code :
  1. #include <algorithm>
  2. #include <iostream>
  3. namespace My {
  4.   struct Class {
  5.     int i;
  6.   };
  7.   std::ostream & operator<<(std::ostream &os, const Class &c)
  8.   {
  9.     return os << c.i;
  10.   }
  11.   struct ClassPointerGreater : std::greater<Class*> {
  12.     bool operator()(const Class *x, const Class *y) const
  13.     {
  14.       return x->i < y->i;
  15.     }
  16.   };
  17. }
  18. int main()
  19. {
  20.   using namespace My;
  21.   Class a, b, c;
  22.   Class* foo[] = { &a, &b, &c};
  23.   for (unsigned i = 0; i < 3; ++i)
  24.     std::cout << *(foo[i]) << ',';
  25.   std::cout << '\n';
  26.   std::sort(foo, foo + 3, ClassPointerGreater());
  27.   for (unsigned i = 0; i < 3; ++i)
  28.     std::cout << *(foo[i]) << ',';
  29.   std::cout << '\n';
  30. }

avec une daube comme ça ?

Reply

Sujets relatifs:

Leave a Replay

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