Thread overview | |||||||||
---|---|---|---|---|---|---|---|---|---|
|
December 10, 2014 mixin template had error by calling shared function | ||||
---|---|---|---|---|
| ||||
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 |
December 10, 2014 Re: mixin template had error by calling shared function | ||||
---|---|---|---|---|
| ||||
Posted in reply to Vlasov Roman | 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.
|
December 10, 2014 Re: mixin template had error by calling shared function | ||||
---|---|---|---|---|
| ||||
Posted in reply to Rikki Cattermole | 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)
|
December 10, 2014 Re: mixin template had error by calling shared function | ||||
---|---|---|---|---|
| ||||
Posted in reply to Rikki Cattermole | https://issues.dlang.org/show_bug.cgi?id=13850 |
December 10, 2014 Re: mixin template had error by calling shared function | ||||
---|---|---|---|---|
| ||||
Posted in reply to Marc Schütz | 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
|
December 10, 2014 Re: mixin template had error by calling shared function | ||||
---|---|---|---|---|
| ||||
Posted in reply to Vlasov Roman | 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.
|
December 11, 2014 Re: mixin template had error by calling shared function | ||||
---|---|---|---|---|
| ||||
Posted in reply to Vlasov Roman | 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 |
Copyright © 1999-2021 by the D Language Foundation