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....