Thread overview | |||||
---|---|---|---|---|---|
|
December 30, 2018 Weird combo of static function, templates, interfaces (that doesn't link) | ||||
---|---|---|---|---|
| ||||
> void main() > { > StaticThingy.register(new SomeAdapter()); > StaticThingy.createSome!Dummy(); > } > > > interface FooAdapter > { > FooBundle!(Handle) createSome(Handle)(); > } > > private class SomeAdapter : FooAdapter > { > Bundle createSome() > { > auto w = new Dummy(); > auto c = new FooDummy(); > auto b = Bundle(c, w); > return b; > } > } > > struct StaticThingy > { > static: > FooBundle!(Handle) createSome(Handle)() > { > return fooAdapter.createSome!(Handle)(); > } > > // ... > error: undefined reference to '_D9onlineapp10FooAdapter__T10createSomeTCQBn5DummyZQyMFZSQCd__T9FooBundleTQBiZQp' > collect2: error: ld returned 1 exit status > Error: linker exited with status 1 Hey :) During playing around I came up with code similar to the example above. As the title says, this code doesn't link. For the full example please see: https://run.dlang.io/is/mr0u2i - But should this even compile successfully? - Does `SomeAdapter` even implement `FooAdapter` correctly? ~ Elias |
December 30, 2018 Re: Weird combo of static function, templates, interfaces (that doesn't link) | ||||
---|---|---|---|---|
| ||||
Posted in reply to 0xEAB | On 12/30/2018 05:05 AM, 0xEAB wrote: >> interface FooAdapter >> { >> FooBundle!(Handle) createSome(Handle)(); >> } Function templates cannot be virtual functions. One reason is the compiler cannot know how large the virtual function table should be, and the other one is it's just a template, not the real thing (i.e. not a function). >> private class SomeAdapter : FooAdapter >> { >> Bundle createSome() SomeAdapter.createSome is a function unrelated to FooAdapter.createSome. Their only relationship is through "name hiding." > - Does `SomeAdapter` even implement `FooAdapter` correctly? Yes because FooAdapter has no virtual function. :p > ~ Elias Ali |
January 02, 2019 Re: Weird combo of static function, templates, interfaces (that doesn't link) | ||||
---|---|---|---|---|
| ||||
Posted in reply to Ali Çehreli | On Sunday, 30 December 2018 at 18:55:10 UTC, Ali Çehreli wrote:
> On 12/30/2018 05:05 AM, 0xEAB wrote:
>
> >> interface FooAdapter
> >> {
> >> FooBundle!(Handle) createSome(Handle)();
> >> }
>
> Function templates cannot be virtual functions. One reason is the compiler cannot know how large the virtual function table should be, and the other one is it's just a template, not the real thing (i.e. not a function).
>
> >> private class SomeAdapter : FooAdapter
> >> {
> >> Bundle createSome()
>
> SomeAdapter.createSome is a function unrelated to FooAdapter.createSome. Their only relationship is through "name hiding."
>
> > - Does `SomeAdapter` even implement `FooAdapter` correctly?
>
> Yes because FooAdapter has no virtual function. :p
>
> > ~ Elias
>
> Ali
Thanks for the technical explanation.
~ Elias
|
Copyright © 1999-2021 by the D Language Foundation