By using this site, you agree to our updated Privacy Policy and our Terms of Use. Manage your Cookies Settings.
458,089 Members | 1,152 Online
Bytes IT Community
+ Ask a Question
Need help? Post your question and get tips & solutions from a community of 458,089 IT Pros & Developers. It's quick & easy.

Problem with operator << and templates

P: n/a
I'm having an error with this code

#include <iostream>

template < typename Tclass TestOpTemplate
{
public:
friend std::ostream& operator<< <>(std::ostream& os, const
TestOpTemplate<T>& m);
};

The error is
declaration of 'operator<<' as non-function

Searchin on the web, i've found that it could be solved using
parenthesis aroung the funcion name, but it doesn't

friend std::ostream& (::operator<< <) (std::ostream& os, const
TestOpTemplate<T>& m);

still doesn't work
Any help please
Aug 2 '08 #1
Share this Question
Share on Google+
4 Replies


P: n/a

"Darío Griffo" <da*****************@gmail.comwrote in message
news:b6**********************************@a1g2000h sb.googlegroups.com...
I'm having an error with this code

#include <iostream>

template < typename Tclass TestOpTemplate
{
public:
friend std::ostream& operator<< <>(std::ostream& os, const
TestOpTemplate<T>& m);
};
#include <iostream>

template < typename Tclass TestOpTemplate
{
public:
friend std::ostream& operator<<(std::ostream& os, const
TestOpTemplate<T>& m);
};

regards
Andy Little
Aug 2 '08 #2

P: n/a
On Aug 2, 5:04*pm, "kwikius" <a...@servocomm.freeserve.co.ukwrote:
#include <iostream>

template < typename Tclass TestOpTemplate
{
public:
friend std::ostream& operator<<(std::ostream& os, const
TestOpTemplate<T>& m);

};

regards
Andy Little
But when I implement the function:

template < typename Tstd::ostream& operator<<(std::ostream& os,
const TestOpTemplate<T>& m)
{
return os
}
i get this

test.cpp:6: warning: friend declaration 'std::ostream&
operator<<(std::ostream&, const TestOpTemplate<T>&)' declares a non-
template function
test.cpp:6: note: (if this is not what you intended, make sure the
function template has already been declared and add <after the
function name here)
linking test (libtool)

That's why i've putted <after the name. Compiling with g++ 4.3.1
Aug 2 '08 #3

P: n/a

"Darío Griffo" <da*****************@gmail.comwrote in message
news:3c**********************************@c58g2000 hsc.googlegroups.com...
On Aug 2, 5:04 pm, "kwikius" <a...@servocomm.freeserve.co.ukwrote:
#include <iostream>

template < typename Tclass TestOpTemplate
{
public:
friend std::ostream& operator<<(std::ostream& os, const
TestOpTemplate<T>& m);

};

regards
Andy Little
But when I implement the function:

template < typename Tstd::ostream& operator<<(std::ostream& os,
const TestOpTemplate<T>& m)
{
return os
}
i get this

test.cpp:6: warning: friend declaration 'std::ostream&
operator<<(std::ostream&, const TestOpTemplate<T>&)' declares a non-
template function
test.cpp:6: note: (if this is not what you intended, make sure the
function template has already been declared and add <after the
function name here)
linking test (libtool)

That's why i've putted <after the name. Compiling with g++ 4.3.1

hmmm... Dunno I guess you will have to wait for the experts ... Meanwhile
you could try just defining the function in the class maybe...

regards
Andy Little
Aug 2 '08 #4

P: n/a
On Aug 2, 10:04 pm, "kwikius" <a...@servocomm.freeserve.co.ukwrote:
"Darío Griffo" <dario.griffo.lis...@gmail.comwrote in message
news:b6**********************************@a1g2000h sb.googlegroups.com...
I'm having an error with this code
#include <iostream>
template < typename Tclass TestOpTemplate
{
public:
friend std::ostream& operator<< <>(std::ostream& os, const
TestOpTemplate<T>& m);
};
#include <iostream>
template < typename Tclass TestOpTemplate
{
public:
friend std::ostream& operator<<(std::ostream& os, const
TestOpTemplate<T>& m);
};
Be careful. That declares a non-template function as friend, so
he'll have to implement a non-template function for every
instance of TestOpTemplate.

I know that the current draft very explicitly provides for three
alternatives with regards to friend: a non-template, a template
for which only the corresponding specialization is a friend, and
a template for which all specializations are friend. For some
reason, however, I think that this is a recent clarification or
fix, and the compilers vary in what they actually implement
(except that all support a non-template as friend in more or
less the same manner). Anyway, my "standard" solution is to
define a public member function print(), and then define the
operator<< inline, which just calls it, e.g.:

template< typename T >
class TestOpTemplate
{
public:
void print( std::ostream& ) ;
friend std::ostream& operator<<(
std::ostream& dest,
TestOpTemplate< T const& obj )
{
obj.print( dest ) ;
return dest ;
}
} ;

Since the friend function is defined each time the template is
specialized, it doesn't matter that it's not a template; you get
a new non-template function for each type.

Of course, in practice, the case comes up fairly often, so I've
moved these functions down into a templated base class, so it's
sufficient that my class derives from it, e.g.:

template< typename T >
struct IOStreamOperators
{
friend std::ostream& operator<<(
std::ostream& dest,
T const& obj )
{
obj.print( dest ) ;
return dest ;
}
friend std::istream& operator>>(
std::istream& source,
T& obj )
{
obj.scan( source ) ;
return source ;
}
} ;

template< typename T >
class TestOpTemplate
: public IOStreamOperators< TestOpTemplate < T
{
public:
void print( std::ostream& ) ;
} ;

And in case it isn't obvious:

-- the only reason for the friend in these cases is to allow
you to define the non-member function in the class
definition, and

-- if you never used one of the functions in IOStreamOperators,
it won't be instantiated, so you won't get an error if the
member function it calls isn't present.

--
James Kanze (GABI Software) email:ja*********@gmail.com
Conseils en informatique orientée objet/
Beratung in objektorientierter Datenverarbeitung
9 place Sémard, 78210 St.-Cyr-l'École, France, +33 (0)1 30 23 00 34
Aug 2 '08 #5

This discussion thread is closed

Replies have been disabled for this discussion.