[ svoo @ 24.01.2005. 11:11 ] @
Kad u dole navedenom kodu funkciju za preklapanje operatora definisem izvan tjela klase program se kompajlira ali je javlja linker error.

Jel ima neko logicno objasnjenje...?

code:
/////////////////////////
using namespace std;
template<class T1,class T2>
class Par{
private:
T1 first;
T2 second;
public:
Par(){};
Par(T1 aa,T2 bb):first(aa),second(bb){}
void print();
friend ostream& operator<<(ostream &os,const Par<T1,T2>&par){
os<<"( "<<par.first<<", "<<par.second<<" ) ";
return os;
}
};
template<class T1,class T2>
void Par<T1,T2>::print(){
cout<<first;
cout<<second;
}




int main(int argc, char* argv[])
{
Par<int,int> pr(56,45);
cout<<pr;//ovo radi ... kad se definise unutar klase....
cin.get();
return 0;
}

unaprijed hvala

pozdrav
[ filmil @ 24.01.2005. 13:42 ] @
Pošalji i tekst greške, da ne bismo morali da čitamo misli.

f
[ Dragi Tata @ 24.01.2005. 14:16 ] @
A pošalji i definiciju operatora << van klase. Da je nisi zaboravio?
[ Angry-Someone @ 24.01.2005. 17:11 ] @
to se meni događalo ako sam odabrao nova aplikacija umjesto console i problemi sa tform kod istog ;)
[ svoo @ 25.01.2005. 12:23 ] @
def izvan klase..

Code:

#include<iostream>
using namespace std;
template<class T1,class T2>
class Par{
   private:
       T1 first;
       T2 second;
   public:
      Par(){};
      Par(T1 aa,T2 bb):first(aa),second(bb){}
      void print();
      friend ostream& operator<<(ostream &,const Par<T1,T2>&);

};
template <typename T1,typename T2>
ostream& operator<<(ostream &os,const Par<T1,T2>&par){
          os<<"( "<<par.first<<", "<<par.second<<" ) ";
          return os;
}    
template<class T1,class T2>
void Par<T1,T2>::print(){
    cout<<first;
    cout<<second;
}    




linker error
Code:

  [Linker error] undefined reference to `operator<<(std::ostream&, Par<int, int> const&)' 


// filmil: code tagovi
[ Dragi Tata @ 25.01.2005. 20:11 ] @
Welcome to the world of friend templates ;)

Doteraj deklaraciju operatora da izgleda ovako (obrati pažnju na dodatni par uglastih zagrada):

Code:

friend ostream& operator<< <>(ostream &,const Par<T1,T2>&);


Ko kaže da je C++ komplikovan jezik? :)
[ NeznamTkoSam @ 08.02.2005. 20:53 ] @
A sto znace oni parametri linkeru (npr. -lmsimg32)?
[ ivbrcic @ 09.02.2005. 08:31 ] @
Evo rjesenja, sada radi.

Code:

#include<iostream>

using namespace std;

template<typename T1,typename T2>
class Par {
    T1 first;
    T2 second;
public:
    Par() { }
    Par(T1 aa,T2 bb) : first(aa), second(bb) { }
    void print() const;
    template <typename T1,typename T2>
    friend ostream & operator<< (ostream &os,const Par<T1, T2> &par);

};

template <typename T1,typename T2>
ostream & operator << (ostream &os, const Par<T1, T2> &par)
{
    os<<"( "<<par.first<<", "<<par.second<<" ) ";
    return os;
}

template<class T1,class T2>
void Par<T1,T2>::print() const
{
    cout<<first;
    cout<<second;
}

int main ()
{
    Par<int,int> pr(56,45);
    cout << pr;                //ovo radi sada uvijek
}


Znaci kada pises friend funkciju tada i unutar klase moras navesti template <typename ...>
[ Dragi Tata @ 09.02.2005. 13:21 ] @
Citat:
ivbrcic
Znaci kada pises friend funkciju tada i unutar klase moras navesti template <typename ...>


Ne moraš. Dovoljan je par uglastih zagrada.
[ ivbrcic @ 10.02.2005. 07:43 ] @
Ako mi to pronades u standardu, onda cu priznati da "ne moras".

[ Dragi Tata @ 10.02.2005. 13:07 ] @
Pogledaj odeljak 14.5.3 standarda, ili još bolje odeljak 8.4.1 knjige C++ Templates: The Complete Guide
[ ivbrcic @ 10.02.2005. 13:41 ] @
Hvala, priznajem sada "ne moras".
[ filmil @ 10.02.2005. 14:27 ] @
Život je pun malih svakodnevnih pobeda...

f
[ Dragi Tata @ 10.02.2005. 14:29 ] @
...nad samim sobom.