Archived

This topic is now archived and is closed to further replies.

Templated Friend's???

This topic is 6388 days old which is more than the 365 day threshold we allow for new replies. Please post a new topic.

If you intended to correct an error in the post then please contact us.

Recommended Posts

What would be the proper syntax for declaring a templated friend method? This is what I have so far #include < iostream.h > template < class T> class JGTuplet { friend ostream& operator < <(ostream&, const JGTuplet < T > &); . . . The rest of the class }; This would have worked in BCB 4.0 Pro but Linux gcc complains that the above code does not declare a templated friend function. This is the way I've learned how to do it. It suggests having the template function already declared, and placing a < Type > in front of the opening function parenthesses (after the operator<< in the above code). What gives? Thanks, joeG Edited by - joeG on 6/16/00 3:36:03 PM

Share this post


Link to post
Share on other sites
I can't say for sure, but in DJGPP you'd write:

    
friend ostream& operator<< <> ( ostream&, const JGTuplet<T>& );


to make it work. Maybe worth a shot?

/TP



Edited by - suburber on June 16, 2000 5:45:09 PM

Share this post


Link to post
Share on other sites
Guest Anonymous Poster
quote:
Original post by suburber

I can''t say for sure, but in DJGPP you''d write:

        
friend ostream& operator<< <> ( ostream&, const JGTuplet<T>& );
[/source]

to make it work. Maybe worth a shot?

/TP



Edited by - suburber on June 16, 2000 5:45:09 PM <hr height=1 noshade></BLOCKQUOTE></font>

Um, didn''t work. Of what I gathered g++ requires you to do something like this

[source]
template <class T>
friend ostream& operator<< <T> (ostream&, const JGTuplet<T>&);


I''ll try it without the T in the middle of the template specifiers between "operator<<" and "(ostream &..."

joeG

Share this post


Link to post
Share on other sites
Um, didn''t work. Of what I gathered g++ requires you to do something like this

     
template <class T>
friend ostream& operator<< <T> (ostream&, const JGTuplet<T>&);


I''ll try it without the T in the middle of the template specifiers between "operator<<" and "(ostream &..."

joeG

Sorry about how ugly the above post turned out. I wouldn''t mind at all if it got deleted *Hint, hint*

Share this post


Link to post
Share on other sites
Um, finally hacked my way to the solution...

In gcc (g++, c++) you'll have to do something like this.



In file, x.h


                

template <class Type> class X;

template <class Type>
ostream& operator<<(ostream&, X<Type>&);

template <class Type>
class X
{
private:
protected:
public:
friend ostream& operator<< <Type> (ostream &, const X<Type>&);
};

[/source]

<hr>
<h1>In file, x.cpp</h1>

[source]
template class X<int>;
template class X<long>;
template class X<float>;
template class X<double>;
template class X<char*>;
template class X<bool>;

template ostream& operator<<(ostream&, X<int>);
template ostream& operator<<(ostream&, X<long>);
template ostream& operator<<(ostream&, X<float>);
template ostream& operator<<(ostream&, X<double>);
template ostream& operator<<(ostream&, X<char*>);
template ostream& operator<<(ostream&, X<bool>);

template <class Type>
ostream& operator<<(ostream&, X<Type>)
{
//implementation

}
[/source]

<hr>
<h1>in file, main.cpp</h1>

[source]

#include "x.h"

int main(int argc, char **argv)
{
X<int> a;
/*
The following line would cause an error because
you didn't explicitly declare to gcc (or the linker)
that you expect a template type of `unsigned char'
*/

X<unsigned char> b;
.
.
.
return 0;
}


I hope this will prove helpful to some of the people trying to work with Linux/Unix gcc.

joeG



Edited by - joeG on June 19, 2000 10:00:38 AM

Share this post


Link to post
Share on other sites
I''ve given up trying to fix the above post, I think you all will get the idea, but if one of the moderators would be so kind, I''d be very grateful.

joeG

Share this post


Link to post
Share on other sites