<div dir="ltr"><div><div>I observed following points by changing the test case as per above discussion :<br><br></div>1. If i move the function template definition outside the class template, the compiler doesn't complain about not finding the definition and compiles the code without any error. This is normal behavior and the bug was not related to this case, as the compiler finds the function definition.<br>
<br></div>2. If i change the friend function template (defined inside the class) into non-template friend function with definition inside the class template, the compiler complains of redefinition of the function :<br><br>
<i>' error: redefinition of 'f'<br>  friend void f(int r){<br>              ^<br>19095.cpp:28:13: note: in instantiation of template class 'C<double>' requested<br>      here<br>  C<double> c;'   </i><div>
<br><br></div><div>3. If the test case is unchanged, then compiler complains of not finding the body. <br><br></div><div>4. Agreed to above point that when class template will be instantiated twice, it will result in redefinition of the friend function.<br>
<br></div><div>I agree that with respect to use case, its always good to move definition outside the class. However, as it is legal to define friend function inside class, hence the above bug.<br><br></div><div>I have sent a patch related to this test case to cfe-commits under the subject  <br>
<br>'<span style="font-weight:normal">[PATCH] PR19095 Undefined reference to friend template function defined inside template class</span>'<br><br>which resolves the 'undefined reference' error. I haven't included test case yet in the patch. Please help in reviewing the same.<br>
</div></div><div class="gmail_extra"><br><br><div class="gmail_quote">On Fri, Mar 14, 2014 at 11:45 PM, John McCall <span dir="ltr"><<a href="mailto:rjmccall@apple.com" target="_blank">rjmccall@apple.com</a>></span> wrote:<br>
<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div class="">On Mar 14, 2014, at 4:36 AM, suyog sarda <<a href="mailto:sardask01@gmail.com">sardask01@gmail.com</a>> wrote:<br>

> Will the second instantiation of the class template introduce redefinition of f? In my opinion, friend functions are<br>
> non-member functions of class (independent of the class). So, no matter how many times we instantiate the class template,<br>
> there won't be redefinition of the function. Please correct me if i am wrong.<br>
<br>
</div>You are correct that a friend function is not a class member.  However, it is still templated, and instantiating a class effectively inserts redeclarations of its friend functions into the appropriate scopes.  When those redeclarations resolve to the same entity (i.e. when their signature does not depend on the enclosing template parameters), they can end up defining it multiple times.<br>

<br>
Among other things, recall that the definition appears within a template and therefore its body can depend on those template parameters.<br>
<br>
We should fix the bug that you’ve identified, but I highly recommend actually moving the function definition outside of the class.<br>
<span class="HOEnZb"><font color="#888888"><br>
John.</font></span></blockquote></div><br><br clear="all"><br>-- <br>With regards,<br>Suyog Sarda<br>
</div>