c++ template

Utálom a C++ sablonjait meg az idétlen hibaüzeneteit :S

Hozzászólások

+1! :)

legalabbis a hibauzikre. a templattel semmi bajom. mibe futottal bele?

A működő kód:


template < typename _Elem, class _Cmp = std::less<_Elem> >
class SortedList {
  std::vector<_Elem> vect;
public:
  typedef typename std::vector<_Elem>::const_iterator const_iterator;
  typedef typename std::vector<_Elem>::const_iterator const_iterator;
  typedef typename std::vector<_Elem>::reverse_iterator reverse_iterator 


  void insert(const _Elem& e);
  // ...
};


template < typename _Elem, class _Cmp >
void
SortedList<_Elem, _Cmp>::insert(const _Elem& e)
{
  reverse_iterator it = vect.rbegin();
  _Cmp cmp;
  for (;it != vect.rend(); ++it) {
    if (cmp(*it, e))
      break;
  }
  vect.insert(it.base(), e);
}

És a rossz:


template < typename _Elem, class _Cmp >
void
SortedList<_Elem, _Cmp>::insert(const _Elem& e)
{
  reverse_iterator it = vect.rbegin();
  for (;it != vect.rend(); ++it) {
    if (_Cmp(*it, e))
      break;
  }
  vect.insert(it.base(), e);
}

Nem igazán jöttem rá, hogy mi a baja a _Cmp(*it, e) kifejezéssel, több, mint fél órámba telt, mire rájöttem, hogy igazából csak az, hogy az típus, és nem pedig változó, tehát nem árt abból egy változó. Persze hibaüzenetből nem derült ki, csak az, hogy nincs ilyen konstruktora (_Elem& , const _Elem&), amikor nekem az operator()(...) kellett volna

Van ilyen konstruktora? Nincs.
Amit eredetileg leírtál, az azt jelentette, hogy meghívsz egy ilyen konstruktort? Igen.
Akkor meg mi a probléma?

Egyébként ez nem template hibaüzenet probléma, mert template nélkül is sima típussal is elronthatod... Na jó, úgy azért ritkább. :)

Komolyabb gond, hogy template hibánál párszáz sornyi hibaüzenetet kaphatsz...

"...handing C++ to the average programmer seems roughly comparable to handing a loaded .45 to a chimpanzee."
-- Ted Ts'o

A sablonok jó dolgok, de a hibaüzenetek valóban nem embernek valók!

KisKresz

Nem gazok a hiba uzik, ha az ember kelloen sokat kap, akkor megtanulja ropteben ertelmezni is oket :)
Sablonokkal mi a gond?

A sablonokkal? Hát csak a sablon-szerződés modell hiánya a bajom. A sablon specifikációjából nem tudom, hogy mit használ, csak ha soronként megnézem a kódját. Szóval, ha épp a saját típusomra nincsen definiálva a kiíró operátor (operator<<(ostream&, const T&)), akkor ez egészen addig nem derül ki, amíg a megfelelő függvényt nem hívom meg. Ez nem lenne így a sablon-szerződés modell mellett, mert a sablon specifikációjában meg kellene adnom, mit szeretnék használni. Szerencsére a következő C++ szabványnál már próbálgatják ezt (concept-ek), hogy felsorolják, a sablonparaméternek milyen műveletekkel (tulajdonságokkal) kell rendelkeznie. Csak mire az elterjed, bő egy-másfél évtized, és egyáltalán, kérdéses, mikor fogadják el...

"ez egészen addig nem derül ki, amíg a megfelelő függvényt nem hívom meg"
Ez nem feltétlen bug, inkább feature.
Utálnám ha egy konténer tipus megkövetelné az operator<-t mert van egy sort metódusa, amit én sose használok, de emiatt a saját típusomat nem tarthatnám a konténerben...

"A sablon specifikációjából nem tudom, hogy mit használ, csak ha soronként megnézem a kódját."
Jól megválasztott sablonparaméter nevekkel (RandIter, stb) és megfelelő dokumentációval a probléma fel sem merül.

Egyébként meg a Boost-ban vannak jó kis makrók erre, úgyhogy most is megoldható. Persze az új szabvánnyal tisztább szárazabb érzés, de ez leginkább a hibaüzeneteknél lesz segítség, de pl pont ez a "csak akkor szól ha használom" tudtommal nem fog változni.

"...handing C++ to the average programmer seems roughly comparable to handing a loaded .45 to a chimpanzee."
-- Ted Ts'o

Nézőpont kérdése, nekem az Ada sablonjai szimpatikusabbak :)

"Utálnám ha egy konténer tipus megkövetelné az operator<-t mert van egy sort metódusa, amit én sose használok, de emiatt a saját típusomat nem tarthatnám a konténerben..."

Ha ez igaz egy ilyen tárolóra, akkor ott elég nagy baj van :) Az STL-nél nem nagyon van ilyen, hál'égnek. A típus felülete elvileg minimális. A kiegészítő tagfüggvények meg azt csinálnak, amit akarnak.

Azt hiszem, nem trivi egy prognyelvek zh-t sem megírni, a fenti annak egy részlete volt.