On Wednesday, 24 January 2018 at 07:21:09 UTC, Shachar Shemesh wrote:
test.d(6): Error: struct test.A(int var = 3) is used as a type

Of course it is. That's how structs are used.

Program causing this:
struct A(int var = 3) {
    int a;
}

void main() {
    A a;
}

To resolve, you need to change A into A!(). For some reason I have not been able to fathom, default template parameters on structs don't work like they do on functions.

IMO the error message is not too bad once you understand what's going on (which probably means it's really not a good error message).

struct A(int var = 3) is short for:

template A(int var = 3)
{
    struct A
    {
        //...
    }
}

As I'm sure you know.

If it's written out like this then I think it makes it obvious what the problem is. When you write `A a`, you're trying to use this template like a type, but templates are not types; they are used to _construct_ types. Therefore, to construct a valid type from the template A, you have to instantiate it by declaring an `A!() a`.

The compiler could allow implicit insatntiation if the template has 0 arguments or only default arguments, but as Jonathan showed, this causes a lot of ambiguous cases that are better avoided.

One way we could probably improve the error message is to change it to "template struct test.A(int var = 3) is used as a type. It must be instantiated", or something along those lines, to make it clear why you can't use A as a type.

Reply via email to