Forum Sveta kompjutera

Nazad   Forum Sveta kompjutera > Test Run > Programiranje
Uputstvo Članstvo Kalendar Današnje poruke Pretraži

Programiranje Programski jezici, tehnike, alatke...

Odgovor
 
Alatke vezane za temu Vrste prikaza
Stara 2.9.2011, 21:45   #1
clzola
Član
 
Član od: 14.4.2010.
Lokacija: Podgorica
Poruke: 332
Zahvalnice: 61
Zahvaljeno 11 puta na 11 poruka
Određen forumom C++, neka greska sa templatom ?

Jezik: C++

Prijavljuje mi gresku na sledeci kod...
Predajem funkciju tipa bool, kao argument, a zatim sa tom funkcijom kreiram template strukturu edgeComparator i nju predajem za priority_queue.
Kod:
// Struktura edge
struct edge {
    int startNode;
    int endNode;
    int value;
};

// Funkcija za uporedjivanje
bool compare(edge lhs, edge rhs)
{
    return lhs.value>rhs.value;
}

// Ovo je template. za uporedjivanje dvije strukture, koji zavisi od edge.
template<bool(*f)(edge, edge)>
  struct edgeComparator {
      bool operator()(const edge& lhs, const edge& rhs) const {
          return f(lhs, rhs);
      }
  };

int put(graph* g, int start, int end, bool(*f)(edge, edge))
{
    edgeComparator<f> comparator; // Ovjde prijavi gresku
    priority_queue<edge, vector<edge>, comparator> edgeQ; // ovdje prijavi gresku
   
    ...
}
Error:
Kod:
error: ‘f’ cannot appear in a constant-expression|
error: template argument 1 is invalid|
error: invalid type in declaration before ‘;’ token|

error: ‘comparator’ cannot appear in a constant-expression|
error: template argument 3 is invalid|
error: invalid type in declaration before ‘;’ token|
clzola je offline   Odgovor sa citatom ove poruke
Stara 2.9.2011, 23:07   #2
Geomaster
V.I.P. Programiranje
 
Član od: 28.6.2007.
Lokacija: Beograd
Poruke: 2.342
Zahvalnice: 2.836
Zahvaljeno 1.047 puta na 507 poruka
Slanje poruke preko MSN-a korisniku Geomaster Slanje poruke preko Skypea korisniku Geomaster
Određen forumom Re: C++, neka greska sa templatom ?

Loše. Mešaš templejtove i run-time vrednosti varijabla.
Template očekuje nešto što se može utvrditi tokom kompajlovanja. Ti mu prosleđuješ funkciju koju si dobio kao argument - totalni type mismatch. Korišćenje function pointera je prilično loše rešenje, ali bi mogao da umesto sa templejtom, to da uradiš kao member vairable:
Kod:
struct edge_comp
{
protected:
     bool (*mFunction)(const edge&, const edge&);
public:
     edge_comp(bool (*f)(const edge&, const edge&)) : mFunction(f)
     { ; }

     inline bool operator()(const edge& one, const edge& two) const
     { return mFunction(one, two); }
};

int main(int argc, char** argv) 
{
    // neka je compare globalna funkcija za upoređivanje
    edge_comp comp(&compare);
    
    return 0;
}
Ali function pointeri su jako loše rešnje. Menjaj to
Geomaster je offline   Odgovor sa citatom ove poruke
Sledeći korisnik se zahvaljuje korisniku Geomaster na korisnoj poruci:
clzola (3.9.2011)
Odgovor

Bookmarks sajtovi


Vaš status
Ne možete postavljati teme
Ne možete odgovarati na poruke
Ne možete slati priloge uz poruke
Ne možete prepravljati svoje poruke

BB kod: uključeno
Smajliji: uključeno
[IMG] kod: uključeno
HTML kod: isključeno


Slične teme
tema temu započeo forum Odgovora Poslednja poruka
Veliki problem sa Transcend plejerom - Sennheiser sluške ne rade a druge rade kefalo Zvuk na računaru 7 3.2.2011 23:45
Problem sa puštanjem HD filmova sa eksternog HDD-a Pipboy Foto i audio/video 0 24.12.2010 21:09
Sve što niste znali o avanturama, a, iskreno, nije vas ni zanimalo Shlaymara Avanturističke igre 25 5.5.2010 15:22
leadtek Winfast 2000 expert - nemogu da dobijem signal na s-video ulazu sa sat. risiv ural Foto i audio/video 17 30.8.2006 1:36


Sva vremena su po Griniču +2 h. Sada je 21:37.


Powered by vBulletin® verzija 3.8.7
Copyright ©2000–2025, vBulletin Solutions, Inc.
Hosted by Beograd.com