Template argument deduction not working with template specialization

Paul paultjeadriaanse at gmail.com
Sun Jan 17 22:17:11 UTC 2021


I just figured out half of my frustration is caused by a 
collision between the 'alias this'd template possibillity and the 
normal one.
For example:

> struct Bar(uint size, V) {
> 	V[size] blup;
> 	alias blup this;
> }
> 
> void foo(S : T[], T)(S a) {
> 	pragma(msg, "first");
> }
> 
> void foo(S : Bar!(T, U), uint T, U)(S a) {
> 	pragma(msg, "second");
> }

> Bar!(2, int) bar;
> foo(bar);

Will cause "called with argument types `(Bar!(2u, int))` matches 
both:DUB"
(And "undefined identifier `T`DUB", "undefined identifier 
`U`DUB", but thats a false positive :/)
While removal of either will make it work fine, as would removal 
of the alias.

Templating:
> The template picked to instantiate is the one that is most 
> specialized that fits the types of the TemplateArgumentList.
Alias this:
> If an aggregate declaration defines an opCmp or opEquals 
> method, it will take precedence to that of the aliased this 
> member.

I was of the impression D only defaulted to the alias when the 
original implementation of a (member) function was missing / 
disfunctional. Shouldn't aliasing also follow this logic when 
using template specializations? (Even though it may not be a 
member function)


More information about the Digitalmars-d-learn mailing list