On 07/21/12 08:29, Ali Çehreli wrote: > On 07/20/2012 06:47 PM, Eyyub wrote: >> I have a question about the semantic of parameter >> specialization(TemplateTypeParameterSpecialization) >> In this following code, there are 2 forms of the same function 'add' : >> <code> >> >> T add(T, U : T) (T a, U b) //doesn't work >> { >> return a + b; >> } >> >> T add(T, U) (T a, U b) if(is(U : T)) //works >> { >> return a + b; >> } >> >> >> void main() >> { >> assert(add(2, cast(short)2) == 4); >> } >> </code> >> So, I infer that, in this case, TemplateTypeParameterSpecialization and >> TypeSpecialization(of IsExpression) aren't semantically equal ? What are >> differences between this 2 forms ? > > The confusion is due to the two different meanings of the ':' operator. > > 1) In the template parameter list, ':' specializes U. "U : T" means: "this is > a specialization where U is T". > > http://dlang.org/template.html > > (Search for the "Specialization" section.) > > When you use the template, T is int and U is short; so that specialization is > not considered.
No; it would be considered. The problem is likely related to "Function template type parameters that are to be implicitly deduced may not have specializations". Note that T add(T, U : int) (T a, U b) {...} already works, and "add(T, U : T)" could probably be made to work too. artur