www.digitalmars.com         C & C++   DMDScript  

digitalmars.D.learn - mixin template had error by calling shared function

reply "Vlasov Roman" <vlasovroman.ru yandex.ru> writes:
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
Dec 10 2014
next sibling parent reply Rikki Cattermole <alphaglosined gmail.com> writes:
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.
Dec 10 2014
next sibling parent reply "Marc =?UTF-8?B?U2Now7x0eiI=?= <schuetzm gmx.net> writes:
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)
Dec 10 2014
parent reply "Vlasov Roman" <vlasovroman.ru yandex.ru> writes:
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
Dec 10 2014
parent Rikki Cattermole <alphaglosined gmail.com> writes:
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.
Dec 10 2014
prev sibling parent "Marc =?UTF-8?B?U2Now7x0eiI=?= <schuetzm gmx.net> writes:
https://issues.dlang.org/show_bug.cgi?id=13850
Dec 10 2014
prev sibling parent Dan Olson <zans.is.for.cans yahoo.com> writes:
Here is a way that will work.

"Vlasov Roman" <vlasovroman.ru yandex.ru> writes:
 I have this code

 mixin template Template(void function() func1, void function() func2)
mixin template Template(alias func1, alias func2)
 class SomeClass {
 	mixin Template!(&func, &func23);
mixin Template!(func, func23); -- dano
Dec 11 2014