Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.

Preklapanje operatora<< GENERICKE funkcije

[es] :: C/C++ programiranje :: Preklapanje operatora<< GENERICKE funkcije

[ Pregleda: 1662 | Odgovora: 3 ] > FB > Twit

Postavi temu Odgovori

Autor

Pretraga teme: Traži
Markiranje Štampanje RSS

azzpoz

Član broj: 300637
Poruke: 96



+1 Profil

icon Preklapanje operatora<< GENERICKE funkcije28.11.2013. u 21:21 - pre 75 meseci
Code:
#include <iostream>
using namespace std;

template <class TIP>
class Konstrukcija
{
      TIP *niz;
      int _trenutno; // trenutna poz. u nizu
      int _max;      // maksimalno elemenata
      
public:
       Konstrukcija()
       {
                     _trenutno = 0;
                     _max = 10;
                     niz = new TIP[_max];
       }
//bez destruktora i sl...
      
      void dodaj(TIP obj)
      {
           niz[_trenutno] = obj;
           ++_trenutno;
      }
      
     friend ostream &operator<< <>(ostream &, Konstrukcija<TIP> &);   // <<<<<<<<<<<<<<<<<<<<
   //  upitno je kada stavim   <>    , ali i ovako ne radi


};

template <class TIP>
ostream &operator<<(ostream &OUT, Konstrukcija<TIP> &obj)
{
        for(int i=0; i<obj._trenutno; i++)
                OUT << obj._niz[i];
        return OUT;
}
int main()
{
    Konstrukcija<int> stub;
    
    stub.dodaj(2);
    stub.dodaj(10);
    
    cout << stub;
system("pause>0"); return 0;
}


Uspijem koristiti program s funkcijom clanicom koja koja je tipa void i slicna funkciji operatora<<, ali zasto preklopljeni operator ne radi???
 
Odgovor na temu

Burgos
Nemanja Borić
Amazon Web Services
Berlin

Član broj: 12484
Poruke: 1912
212.178.232.*

Sajt: stackoverflow.com/users/1..


+471 Profil

icon Re: Preklapanje operatora<< GENERICKE funkcije28.11.2013. u 21:33 - pre 75 meseci
Potrebno je da kompajleru ostaviš deklaracije, pre friend iskaza:


Code:
#include <iostream>
using namespace std;


// 2. Međutim, sama deklaracija zahteva deklaraciju klase Konstrukcija
//     zbog parametra obj
template <class TIP>
class Konstrukcija;


// 1. Potrebno je da ostaviš deklaraciju operator<< 
template <class TIP>
ostream &operator<<(ostream &OUT, Konstrukcija<TIP> &obj);


template <class TIP>
class Konstrukcija
{
      TIP *niz;
      int _trenutno; // trenutna poz. u nizu
      int _max;      // maksimalno elemenata

public:
       Konstrukcija()
       {
                     _trenutno = 0;
                     _max = 10;
                     niz = new TIP[_max];
       }
//bez destruktora i sl...

      void dodaj(TIP obj)
      {
           niz[_trenutno] = obj;
           ++_trenutno;
      }
     // moze i operator<< <TIP>(...
     friend ostream &operator<< <>(ostream &, Konstrukcija<TIP> &);   // <<<<<<<<<<<<<<<<<<<<
   //  upitno je kada stavim   <>    , ali i ovako ne radi


};

template <class TIP>
ostream &operator<<(ostream &OUT, Konstrukcija<TIP> &obj)
{
        for(int i=0; i<obj._trenutno; i++)
                OUT << obj.niz[i];
        return OUT;
}
int main()
{
    Konstrukcija<int> stub;

    stub.dodaj(2);
    stub.dodaj(10);

    cout << stub;
    return 0;
}
 
Odgovor na temu

azzpoz

Član broj: 300637
Poruke: 96



+1 Profil

icon Re: Preklapanje operatora<< GENERICKE funkcije29.11.2013. u 06:29 - pre 75 meseci
Koji je razlog za ostavljanje deklaracije klase i operatora pre friend iskaza???
 
Odgovor na temu

Burgos
Nemanja Borić
Amazon Web Services
Berlin

Član broj: 12484
Poruke: 1912
212.178.232.*

Sajt: stackoverflow.com/users/1..


+471 Profil

icon Re: Preklapanje operatora<< GENERICKE funkcije29.11.2013. u 09:23 - pre 75 meseci
Zapravo, samo je bitno ostaviti deklaraciju funkcije pre friend iskaza. Međutim, pošto u deklaraciji funkcije figuriše klasa, potrebno je ostaviti i deklaraciju klase pre nje.

Da ja sad ne bih bespotrebno uprošćavao, ili prekucavao, evo odličan članak na tu temu: http://www.parashift.com/c++-faq-lite/template-friends.html
 
Odgovor na temu

[es] :: C/C++ programiranje :: Preklapanje operatora<< GENERICKE funkcije

[ Pregleda: 1662 | Odgovora: 3 ] > FB > Twit

Postavi temu Odgovori

Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.