Declaring friend overloaded operators in templates

Hi, everyone,

I'm compiling the following code with VC++ SP5, and running into strange errors:

(line 5 is the one with the friend operator* declaration)
-------------------------------------------------------
template< class T > class aa
{
public:
      T a;
      friend aa<T> operator*<> ( const aa<T>&, const aa<T>& );
};

template< class T> aa<T> operator* ( const aa<T>& i, const aa<T> & j)
{
      return i*j;
}

int main()
{
      return 0;
}
---------------------------------------------------------------
This compiles fine on MinGW.


I have STLPort installed, but I've moved the directories well down, so they should not create problems.
Errors in VC++ are:
###########
new.cxx(5) : error C2143: syntax error : missing ';' before '<'
see reference to class template instantiation 'aa<T>' being compiled
###########
After this, there are more errors as cl assumes that the friend being declared is data, rather than function, and so on.

My question: What am I doing wrong?
narkieAsked:
Who is Participating?
I wear a lot of hats...

"The solutions and answers provided on Experts Exchange have been extremely helpful to me over the last few years. I wear a lot of hats - Developer, Database Administrator, Help Desk, etc., so I know a lot of things but not a lot about one thing. Experts Exchange gives me answers from people who do know a lot about one thing, in a easy to use platform." -Todd S.

Sys_ProgCommented:
>>>>>>   friend aa<T> operator*<> ( const aa<T>&, const aa<T>& );

What do u mean by putting <> after *

0
narkieAuthor Commented:
http://gcc.gnu.org/faq.html#friend

To quote:

"the angle brackets must be present, otherwise the declaration will be taken as a non-template function"
0
Sys_ProgCommented:
Hi narkie

I am not very sure, but that may be specifc to compilers

refer the following link for the same

http://msdn.microsoft.com/library/default.asp?url=/library/en-us/vccelng/htm/tions_31.asp

HTH
Amit
0

Experts Exchange Solution brought to you by

Your issues matter to us.

Facing a tech roadblock? Get the help and guidance you need from experienced professionals who care. Ask your question anytime, anywhere, with no hassle.

Start your 7-day free trial
Get your problem seen by more experts

Be seen. Boost your question’s priority for more expert views and faster solutions

Sys_ProgCommented:
I think removing the <> after * would do the job

I would have tried it but I do not currently have access to a VC compiler.

HTH

Amit
0
SteHCommented:
looking at the faq you posted the function has to be forward declared:

template <class T>
class aa;

template <class T>
aa<T> opertor*<> (const aa<T>&, const aa<T>&);

template <class T> class aa {
....
}

before defining it.
0
narkieAuthor Commented:
Sorry for being so late guys (arrg. sleep :().

@SteH:
Doing a declaration as you rightly noticed (my mistake - didn't read the FAQ properly) merely transfers the error from the friend declaration to the first declaration. MinGW seems to handle it fine, though. I wonder what's happening...

@Sys_Prog:
Removing the  angle brackets makes it a template class with a non-template function declaration. Strange thing is, if I do that, and instantiate two objects of class aa<int> and try to multiply them, cl compiles them happily. gcc (rightly, I think) starts yelling that there is no operator*( const aa<int>&, const aa<int>& ). I'm confused.

Thanks for the help!
0
_ys_Commented:
Slight adjustment to what SteH posted.

template <class T>
class aa;

template <class T>
aa<T> opertor* (const aa<T>&, const aa<T>&);  // *** no <>

template <class T> class aa {
...
    friend template <class T>
    aa<T> opertor*<> (const aa<T>&, const aa<T>&);
...
}
0
efnCommented:
For what it's worth, I think I dealt with a similar problem a few years ago and came to the conclusion that there was no formulation that would compile in both gcc and Visual C++.  I ended up with compiler-specific code selected with #ifdefs.

--efn
0
Sys_ProgCommented:
I agree woth efn

That's what the link in my previous post says
0
narkieAuthor Commented:
Ah well, thank you.
0
It's more than this solution.Get answers and train to solve all your tech problems - anytime, anywhere.Try it for free Edge Out The Competitionfor your dream job with proven skills and certifications.Get started today Stand Outas the employee with proven skills.Start learning today for free Move Your Career Forwardwith certification training in the latest technologies.Start your trial today
C++

From novice to tech pro — start learning today.

Question has a verified solution.

Are you are experiencing a similar issue? Get a personalized answer when you ask a related question.

Have a better answer? Share it in a comment.