Specialized template in different module

ag0aep6g via Digitalmars-d-learn digitalmars-d-learn at puremagic.com
Mon Mar 14 03:17:55 PDT 2016


On 14.03.2016 09:42, John wrote:
>    module one;
>
>    struct Test(T) {}
>
>    void testing(T)(Test!T t) {}
>
>    module two;
>
>    struct Test(T : int) {}
>
>    void main() {
>      Test!int i;
>      testing!int(i);
>    }
>
> Output:
>    error : testing (Test!int t) is not callable using argument types
> (Test!int)
>
> If I put everything in the same module it works. So are template
> specializations limited to the same module?

The two `Test` templates are completely unrelated to each other. 
`one.testing` only accepts `one.Test`, it isn't aware of `two.Test` at all.

You can bring them together with `alias`:

----
module one;
static import two;

alias Test = two.Test;
struct Test(T) {}

void testing(T)(Test!T t) {}
----

`one.testing` still only accepts `one.Test`, but `one.Test` now includes 
`two.Test`, so it works.

Sadly, dmd doesn't like it when you put the alias line behind the struct 
line. I think that's a bug. Filed it here:
https://issues.dlang.org/show_bug.cgi?id=15795


More information about the Digitalmars-d-learn mailing list