Re: Weird combo of static function, templates, interfaces (that doesn't link)
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
Re: Weird combo of static function, templates, interfaces (that doesn't link)
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
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