Kirjautuminen

Haku

Tehtävät

Keskustelu: Ohjelmointikysymykset: C++ Template

jsbasic [15.03.2011 22:50:48]

#

Olen tekemässä omaa lajittelualgoritmia C++:lla, ja ajattelin toteuttaa samanlaisen funktion mitä C:n sort.

http://www.cplusplus.com/reference/algorithm/sort/

template <class RandomAccessIterator, class Compare>
  void sort ( RandomAccessIterator first, RandomAccessIterator last, Compare comp );

Jostain syystä RandomAccessIterator pitää laittaa templateksi, jotta argumentin voi syöttää siinä muodossa. Miksi? Eikö se ole tavallinen luokka.

Haluaisin käyttää omaa myös templatea. Haluaisin että funktiokutsun yhteydessä ilmoittaisin että järjestelen vain kokonaislukuja.

Kokeilin seuraavaa:

template <typename RandomAccessIterator, typename A>
int search_from_ordered_list_koe(RandomAccessIterator first){A o;}
int i= search_from_ordered_list_koe<int>(vektori.begin());

Mutta kääntäjä ilmoittaa ettei kutsuttavaa funktiota löydy.

no matching function for call to 'search_from_ordered_list_koe(std::vector<double*>::iterator)'|

eq [16.03.2011 10:31:36]

#

jsbasic kirjoitti:

Olen tekemässä omaa lajittelualgoritmia C++:lla, ja ajattelin toteuttaa samanlaisen funktion mitä C:n sort.

http://www.cplusplus.com/reference/algorithm/sort/

template <class RandomAccessIterator, class Compare>
  void sort ( RandomAccessIterator first, RandomAccessIterator last, Compare comp );

Jostain syystä RandomAccessIterator pitää laittaa templateksi, jotta argumentin voi syöttää siinä muodossa. Miksi? Eikö se ole tavallinen luokka.

Kyllä, ja ei. Tavallinen luokka tyyppiä ...?

Tyypillä ei ole merkitystä, eikä meitä kiinnosta se; olennaisempaa on, että tyyppi käyttäytyy kuten random_access_iterator. Esimerkiksi mainitsemasi funktio toimii hyvin myös pelkkien osoittimien kanssa.

Varsinaiset iteraattorit ovat kyllä aina luokkatyyppejä, mutta yhteistä kantaluokkaa niillä ei voi olettaa olevan - ainakin standardikirjastoissa näkee käytettävän tapaa, joissa iteraattoriluokka on vain "samanlainen", mutta ei sama kuin <iterator>-headerissa määritelty luokka std::iterator.

jsbasic kirjoitti:

Haluaisin käyttää omaa myös templatea. Haluaisin että funktiokutsun yhteydessä ilmoittaisin että järjestelen vain kokonaislukuja.

Aivan kaikkea ei C++-ohjelmakaan voi viestittää, mutta tässä kohtaa täytyy myöntää etten ole varma, mitä tarkoitat. Kuitenkin, alla esimerkki, jonka saattaa auttaa, tai sitten ei:

// malli eri järjestyksessä
template<typename T, typename RandomAccessIterator>
T convert_iterator_to(RandomAccessIterator iterator)
{
  return static_cast<T>(*iterator);
}

std::vector<double> vec(...);
int i = convert_iterator_to<int>(vec.begin());

// toisaalta (laajempi)

template<typename CT>
struct compare_as {
  template<typename T>
  bool operator()(T a, T b)
  {
    return static_cast<CT>(a) < static_cast<CT>(b);
  }
};

std::vector<double> vec(...);
std::stable_sort(vec.begin(), vec.end(), compare_as<int>());

Alkuperäinen koodi olisi toiminut vaihtamalla mallin tyyppien paikkoja keskenään (ja lisäämällä vaadittu return-statement).

Vastaus

Aihe on jo aika vanha, joten et voi enää vastata siihen.

Tietoa sivustosta