Template specification conflict

Dmitry Olshansky dmitry.olsh at gmail.com
Tue Aug 2 06:25:58 PDT 2011


On 02.08.2011 16:30, simendsjo wrote:
> On 02.08.2011 14:22, Dmitry Olshansky wrote:
>> On 02.08.2011 16:18, simendsjo wrote:
>>> On 02.08.2011 14:13, Dmitry Olshansky wrote:
>>>> On 02.08.2011 16:06, simendsjo wrote:
>>>>> On 02.08.2011 13:55, Dmitry Olshansky wrote:
>>>>>> On 02.08.2011 15:06, simendsjo wrote:
>>>>>>> The following program gives me
>>>>>>> "Error: template t.S.__ctor(C) if(isSomeChar!(C)) conflicts with
>>>>>>> constructor t.S.this at t.d(4)"
>>>>>>>
>>>>>>> Is this because char etc can be converted to uint? Shouldn't the
>>>>>>> template specification make this unambiguous?
>>>>>>>
>>>>>>> import std.traits;
>>>>>>>
>>>>>>> struct S {
>>>>>>> this(uint i) {}
>>>>>>> this(C)(C c) if(isSomeChar!C) {}
>>>>>>> }
>>>>>>>
>>>>>>> void main() {}
>>>>>>
>>>>>> struct S {
>>>>>> this()(uint i) {}
>>>>>> this(C)(C c) if(isSomeChar!C) {}
>>>>>> }
>>>>>>
>>>>>> should do it, though it (and workaround) looks like a bug to me.
>>>>>>
>>>>>
>>>>> With the empty templated this, I get other errors though:
>>>>> "t.d(5): Error: constructor t.S.this conflicts with template
>>>>> t.S.__ctor() at t.d(4)"
>>>>>
>>>>> struct S {
>>>>> this()(int a) {} // 4
>>>>> this(int a, int b) {} // 5
>>>>> }
>>>>>
>>>> Same logic here once you have template constructor, all others need to
>>>> be template, empty spec is a trick to get anything to be a 
>>>> template. And
>>>> in this example you really do not need empty spec () in 4.
>>>>
>>>
>>> So my first example is a bug, and the second is a wrong error message?
>>> Wondering what I should post in a potential bug report, and if it's
>>> one or two bugs.
>> I think there is only one bug: template constructor (and functions IIRC)
>> can't be overloaded with non-template.
>> Both your examples show this bug, since this()(int a){} and this(C)(C c)
>> if(isSomeChar!C) {} are template constructors, while others are not.
>> I think the bug was there for quite some time and likely to be filed
>> already, so check Bugzilla first.
>>
>
> While changing ctors to templates, I came across another issue (bug?) 
> regarding assignment to immutable (and probably const) members from 
> templated ctors:
> Error: can only initialize const member v inside constructor
> Error: template instance t.S2.__ctor!() error instantiating
>
> struct S {
>     immutable int v;
>     this(int v) {
>         this.v = v;
>     }
> }
>
> struct S2 {
>     immutable int v;
>     this()(int v) {
>         this.v = v;
>     }
> }
>
> void main() {
>     auto s  = S(1); // ok
>     auto s2 = S2(1); // fails
> }
>

Most definitely a bug, you seem to hit a lot of 'em recently :)

-- 
Dmitry Olshansky



More information about the Digitalmars-d-learn mailing list