Static function template
Daniel Kozak via Digitalmars-d-learn
digitalmars-d-learn at puremagic.com
Thu May 7 05:05:07 PDT 2015
On Thursday, 7 May 2015 at 11:18:17 UTC, Daniel Kozak wrote:
> On Thursday, 7 May 2015 at 11:15:02 UTC, Daniel Kozak wrote:
>> On Thursday, 7 May 2015 at 11:08:50 UTC, Daniel Kozák wrote:
>>>
>>> On Thu, 07 May 2015 10:46:19 +0000
>>> Lemonfiend via Digitalmars-d-learn
>>> <digitalmars-d-learn at puremagic.com>
>>> wrote:
>>>
>>>> On Thursday, 7 May 2015 at 10:43:28 UTC, Daniel Kozak wrote:
>>>> > On Thursday, 7 May 2015 at 10:39:09 UTC, Daniel Kozák
>>>> > wrote:
>>>> >>
>>>> >> On Thu, 07 May 2015 10:33:44 +0000
>>>> >> Vadim Lopatin via Digitalmars-d-learn
>>>> >> <digitalmars-d-learn at puremagic.com> wrote:
>>>> >>
>>>> >>> struct S
>>>> >>> {
>>>> >>> int i;
>>>> >>>
>>>> >>> auto foo2(T)(int j) {
>>>> >>> i=j;
>>>> >>> }
>>>> >>>
>>>> >>> static S foo(T)(int j) {
>>>> >>> S s;
>>>> >>> s.foo2!T(j);
>>>> >>> return s;
>>>> >>> }
>>>> >>> }
>>>> >>>
>>>> >>> void main()
>>>> >>> {
>>>> >>> auto s = S.foo!bool(1);
>>>> >>> }
>>>> >>
>>>> >> As I said, it is not bug. It is OK. There is no way how
>>>> >> you can
>>>> >> distinguish between static and non static methods or even
>>>> >> field in some
>>>> >> cases.
>>>> >
>>>> > e.g.:
>>>> >
>>>> > import std.stdio;
>>>> >
>>>> > struct S
>>>> > {
>>>> > string foo = "Please select me?";
>>>> > string foo() { return ("No, select me?"); };
>>>> > static string foo() { return ("I am better than the
>>>> > otters :D?"); };
>>>> > }
>>>> >
>>>> > void main()
>>>> > {
>>>> > auto s = S();
>>>> > writeln(s.foo);
>>>> > }
>>>>
>>>> Well it's clear to me now why it shouldn't work.
>>>>
>>>> However, the error msg is not clear on the problem. Imo it
>>>> should give a conflict error like in your previous example.
>>>> That would make it clear what's happened/allowed.
>>>>
>>>
>>> Yep, I think you are right even this example make useless and
>>> wrong error message:
>>>
>>> struct S
>>> {
>>> static S foo(T)(int j) {
>>> S s;
>>> return s;
>>> }
>>> static S foo(T)(int j) {
>>> S s;
>>> return s;
>>> }
>>> }
>>>
>>> void main()
>>> {
>>> auto s = S.foo!bool(1);
>>> }
>>>
>>>
>>> test.d(15): Error: need 'this' for 'foo' of type '(int j)' //
>>> WTF?
>>
>> btw. it is a regresion from 2.067 on 2.066 and before it makes
>> much
>> better error. Even for OP code when is modified (static must
>> be declared before non static one) it have a better error msg.
>>
>> test.d(6): Error: test.S.foo called with argument types (int)
>> matches both:
>> test.d(4): test.S.foo!bool.foo(int j)
>> and:
>> test.d(10): test.S.foo!bool.foo(int j)
>> test.d(18): Error: template instance test.S.foo!bool error
>> instantiating
>>
>> But only when static one is declared before non static one, so
>> even on 2.066 it was not ideal. So I think we should open two
>> issues, probably one for regression and one for enhancment
>
> OK both are regressions, cause on dmd 2.063 it is much much
> better
>
> test.d(19): Error: template test.S.foo matches more than one
> template declaration, test.d(3):foo(T)(int j) and
> test.d(8):foo(T)(int j)
> test.d(19): Error: need 'this' for 'foo' of type 'pure nothrow
> @safe void(int j)'
https://issues.dlang.org/show_bug.cgi?id=14554
More information about the Digitalmars-d-learn
mailing list