mixin template had error by calling shared function

Rikki Cattermole via Digitalmars-d-learn digitalmars-d-learn at puremagic.com
Wed Dec 10 03:34:20 PST 2014


On 11/12/2014 12:24 a.m., Vlasov Roman wrote:
> On Wednesday, 10 December 2014 at 10:34:25 UTC, Marc Schütz wrote:
>> On Wednesday, 10 December 2014 at 09:41:43 UTC, Rikki Cattermole wrote:
>>> On 10/12/2014 10:10 p.m., Vlasov Roman wrote:
>>>> I have this code
>>>>
>>>> import std.stdio;
>>>>
>>>> mixin template Template(void function() func1, void function() func2) {
>>>>
>>>>    void     to() {
>>>>        func1();
>>>>        func2();
>>>>    }
>>>> };
>>>>
>>>> class SomeClass {
>>>>    mixin Template!(&func, &func23);
>>>>
>>>>    void func() {
>>>>        writeln("First function!");
>>>>    }
>>>>
>>>>    void func23() {
>>>>        writeln("First function!");
>>>>    }
>>>>
>>>>    void toTemplate() {
>>>>        to();
>>>>    }
>>>> }
>>>>
>>>> void main() {
>>>>    SomeClass a = new SomeClass();
>>>>
>>>>    a.toTemplate();
>>>> }
>>>>
>>>> After running the program give me SIGSEGV in func23();
>>>>
>>>> Terminal with gdb:
>>>>
>>>> Program received signal SIGSEGV, Segmentation fault.
>>>> 0x0000000000428352 in invariant._d_invariant(Object) ()
>>>> (gdb) up
>>>> #1  0x00000000004257f7 in main.SomeClass.func23() ()
>>>>
>>>>
>>>> Manjaro Linux 0.9.0 x86_64
>>>> dmd 2.066
>>>> Kernel 3.14.4
>>>
>>> Ugh, that's a compiler bug.
>>> You should not be able to pass in delegates as function pointers to a
>>> mixin template.
>>>
>>> A better way would be to pass in the names of the methods into the
>>> mixin template and then use string mixin's to call the methods.
>>
>> Better yet, try this:
>>
>> mixin template Template(void delegate() func1, void delegate() func2)
>
> I tried this, but compiler give me error
>
> main.d(12): Error: no 'this' to create delegate for func
> main.d(12): Error: no 'this' to create delegate for func23
>
> I think that error because i don't completly know dlang

This is why I didn't suggest this myself.
Basically you are trying to take a pointer to a function that takes an 
argument (this). But a delegate is not exactly that. A delegate is a 
function pointer + this pointer as well.
Essentially you can't do this for a type.


More information about the Digitalmars-d-learn mailing list