You can't have a template inside an aggregate with the name "this". This prevents one from creating an advanced function template. This works: struct S { this(int i)(float f) {} } This doesn't: struct S { template this(int i) { this(float f) {} } }
Technically, the 2nd form is not a function template because there's no identifier. The first example is a constructor template. Do you have a compelling reason why the 2nd form should be supported?