fonction retournant une instance de classe template

fonction retournant une instance de classe template - C++ - Programmation

Marsh Posté le 06-08-2005 à 04:44:40    

Salut,
 
Je bloque là-dessus depuis un moment et je ne vois pas ce qui cloche. Voilà ma fonction (raccourcie à son plus simple effet pour montrer le problème) :

Code :
  1. pt::tstrlist<int> traite() {
  2. pt::tstrlist<int> res(SL_SORTED);
  3. return res;
  4. }


 
Avec VC6, lorsque je lance la compilation, j'obtiens :

Code :
  1. d:\Documents\Programmes\FreeBrowserSDK-0.6\fb_notes\fb_notes.cpp(34): error C2558: class 'pt::tstrlist<X>' : pas de constructeur de copie disponible ou le constructeur de copie est déclaré 'explicit'
  2.         with
  3.         [
  4.             X=int
  5.         ]


 
Pour info, pt est le namespace de ptypes et on peut trouver la doc de la classe pt::tstrlist ici, dont voici la définition :

Code :
  1. template <class X> class tstrlist {
  2.     tstrlist(int flags = 0);
  3.     ~tstrlist();
  4.     int    get/set_count(int);
  5.     int    get/set_capacity(int);
  6.     bool   get/set_ownobjects(bool);
  7.     void   clear();
  8.     void   pack();
  9.     bool   get_sorted() const;
  10.     bool   get_duplicates() const;
  11.     bool   get_casesens() const;
  12.     // methods that work both on sorted and unsorted lists
  13.     void   ins(int index, string key, X* obj);
  14.     void   put(int index, string key, X* obj);
  15.     void   put(int index, X* obj);
  16.     int    add(string key, X* obj);
  17.     X*     operator [](int index) const;
  18.     string getkey(int index) const;
  19.     void   del(int index);
  20.     int    indexof(string key) const;
  21.     int    indexof(void* obj) const;
  22.     // these methods are allowed only on sorted lists
  23.     int    put(string key, X* obj);
  24.     X*     operator [](string key) const;
  25.     void   del(string key);
  26.     bool   search(string key, int& index) const;
  27. }


 
Merci de me dire ce qui ne va pas, je suis sùr que c'est pas grand chose en plus...

Reply

Marsh Posté le 06-08-2005 à 04:44:40   

Reply

Marsh Posté le 06-08-2005 à 05:11:44    

ben le message d'erreur est explicite ...

Reply

Marsh Posté le 06-08-2005 à 05:22:55    

Donc (corrigez-moi si j'ai faux), étant donné que ce n'est pas moi qui ai écrit la classe pt::tstrlist, il m'est impossible de faire une fonction qui renvoie un objet de cete classe ?
 
Ou alors il y a quelque chose qui m'échappe...

Reply

Marsh Posté le 06-08-2005 à 06:26:34    

Du coup, j'en suis venu à faire ça, j'espère que ce n'est pas trop laid :

Code :
  1. void traite(pt::tstrlist<int> *liste) {
  2. liste = &(tstrlist<int>(SL_SORTED));
  3. }

Reply

Marsh Posté le 06-08-2005 à 09:24:10    

Les références spamal non plus :o
 

Code :
  1. void traite(pt::tstrlist<int>& liste)
  2. {
  3.   liste = tstrlist<int>(SL_SORTED);
  4. }


Reply

Marsh Posté le 06-08-2005 à 12:03:06    

Joel F a écrit :

Les références spamal non plus :o
 

Code :
  1. void traite(pt::tstrlist<int>& liste)
  2. {
  3.   liste = tstrlist<int>(SL_SORTED);
  4. }



liste = tstrlist<int>(SL_SORTED);

Code :
  1. d:\Documents\Programmes\FreeBrowserSDK-0.6\fb_notes\fb_notes.cpp(45): error C2582: 'operator =' fonction non disponible dans 'pt::tstrlist<X>'
  2.         with
  3.         [
  4.             X=int
  5.         ]


Il n'y a pas de contructeur par recopie dans la classe tstrlist<X> (quelle idée aussi !)

Reply

Marsh Posté le 06-08-2005 à 13:07:20    

Et en fait voilà pourquoi le compilateur ne trouve pas de constructeur par recopie : tsrtlist<X> (comme les autres structures "liste" de ptypes) dérive (par transitivité) d'une classe "noncopyable" :

Code :
  1. class ptpublic noncopyable
  2. {
  3. private:
  4.     noncopyable(const noncopyable& );
  5.     const noncopyable& operator= (const noncopyable& );
  6. public:
  7.     noncopyable() {}
  8.     ~noncopyable() {}
  9. };

Reply

Marsh Posté le 06-08-2005 à 14:09:52    

...

Reply

Marsh Posté le 06-08-2005 à 14:33:58    

neo101 a écrit :

Du coup, j'en suis venu à faire ça, j'espère que ce n'est pas trop laid :

Code :
  1. void traite(pt::tstrlist<int> *liste) {
  2. liste = &(tstrlist<int>(SL_SORTED));
  3. }



je relève même pas ...

Reply

Marsh Posté le 06-08-2005 à 16:39:32    

Taz a écrit :

je relève même pas ...


En fait, je sais bien que c'est super laid mais je vois pas d'autre "solution" à ça...
Enfin si, j'ai laissé tombé les ptypes (déçu) pour revenir à une bonne vieille std::map<string, string> !
Le seul "problème", c'est que ma contribution ne sera pas homogène avec le reste du projet qui utilise lui ptypes partout (et surtout pt::string au lieu de std::string).

Reply

Marsh Posté le 06-08-2005 à 16:39:32   

Reply

Marsh Posté le 06-08-2005 à 16:59:16    

c'est pas que c'est laid : c'est que y a 2 erreur fondamentales en une seule ligne ! apprend le C++

Reply

Marsh Posté le 06-08-2005 à 23:00:53    

On croirait réver! :)

Reply

Sujets relatifs:

Leave a Replay

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