Re: Weird combo of static function, templates, interfaces (that doesn't link)

2019-01-02 Thread 0xEAB via Digitalmars-d-learn

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)

2018-12-30 Thread Ali Çehreli via Digitalmars-d-learn

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)

2018-12-30 Thread 0xEAB via Digitalmars-d-learn

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