Bug 798 – Template function overloading problems

Status
RESOLVED
Resolution
INVALID
Severity
normal
Priority
P2
Component
dmd
Product
D
Version
D1 (retired)
Platform
Other
OS
Linux
Creation time
2007-01-06T08:54:00Z
Last change time
2014-02-15T13:12:37Z
Assigned to
bugzilla
Creator
aarti

Comments

Comment #0 by aarti — 2007-01-06T08:54:16Z
class Test { static void func(T)(T v) {} // static void func() {} //Error! Solution: static void func()() {} // static void func(int i, float f) {} //Error! Solution: static void func()(int i, float f) {} static void opCall(T)(T t) {} static void opCall()() {} //Below line in fact conflicts with opCall()() as commenting it solves problem - no workaround known //static void opCall()(int i, float f) {} } void main() { }
Comment #1 by aarti — 2007-01-06T09:45:20Z
[email protected] wrote: > http://d.puremagic.com/issues/show_bug.cgi?id=798 > > Summary: Template function overloading problems > Product: D > Version: 1.00 > Platform: Other > OS/Version: Linux > Status: NEW > Severity: normal > Priority: P2 > Component: DMD > AssignedTo: [email protected] > ReportedBy: [email protected] > > > class Test { > static void func(T)(T v) {} > // static void func() {} //Error! Solution: static void > func()() {} > // static void func(int i, float f) {} //Error! Solution: static void > func()(int i, float f) {} > > static void opCall(T)(T t) {} > static void opCall()() {} > //Below line in fact conflicts with opCall()() as commenting it solves > problem - no workaround known > //static void opCall()(int i, float f) {} > > } > > void main() { > } > > > -- By mistake I left only static functions in example, but the problem occurs for every function.
Comment #2 by sean — 2007-01-06T10:10:35Z
Template functions cannot be overloaded with normal functions. This is by design. [email protected] wrote: > > class Test { > static void func(T)(T v) {} > // static void func() {} //Error! Solution: static void > func()() {} > // static void func(int i, float f) {} //Error! Solution: static void > func()(int i, float f) {} static void func(T)(T v) {} static void func()() {} static void func(T1=void, T2=void)() {} > static void opCall(T)(T t) {} > static void opCall()() {} > //Below line in fact conflicts with opCall()() as commenting it solves > problem - no workaround known > //static void opCall()(int i, float f) {} Same as above. Templates with the same name and same number of templates parameters cannot be overloaded unless one is a specialization of the other. ie. static void func(T, U)(T v1, U v2) {} static void func(T, U)(T v1, U v2, int v3) {} Doesn't work. But: static void func(T, U)(T v1, U v2) {} static void func(T, U : double)(T v1, U v2, int v3) {} Works. The way around this problem is to add dummy template parameters to alter the template parameter count to avoid unwanted collisions: static void func(T, U)(T v1, U v2) {} static void func(T, U, V=void)(T v1, U v2, int v3) {} In the above, V is unused and serves only to change the name mangling of the second template function. Sean
Comment #3 by aarti — 2007-01-06T10:30:15Z
Sean Kelly wrote: > Template functions cannot be overloaded with normal functions.  This is > by design. Maybe it should be reported as enhancement? It's quite unnatural thing... Additionally I was thinking that maybe all functions should be mangled with return type... In such a situation it would be possible to overload functions by return type and overloading template functions with normal functions would be no more problem... PS. If I am wrong about some of these issues just tell me. I am not trying to play expert here - just reporting some awkward (IMHO) behaviour of compiler....
Comment #4 by bugzilla — 2007-02-02T22:35:58Z
Sean's comments are correct. It is by design.