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