Static function template

Daniel Kozak via Digitalmars-d-learn digitalmars-d-learn at puremagic.com
Thu May 7 04:18:16 PDT 2015


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)'




More information about the Digitalmars-d-learn mailing list