On Monday, 23 May 2022 at 15:14:53 UTC, Vindex wrote:
I have this code:

```
import std.array, std.exception, std.stdio;

mixin template RealizeException() {
this(string msg, string file = __FILE__, size_t line = __LINE__) {
        super(msg, file, line);
    }
}

class WrongUsage : Exception {
    mixin RealizeException;

this(string[] messages, string file = __FILE__, size_t line = __LINE__) {
        auto msg = std.array.join(messages, "\n");
        super(msg, file, line);
    }
}

void main() {
    throw new WrongUsage("Error message.");
}
```

... and this error:

```
mixin_exception.d(19): Error: constructor `mixin_exception.WrongUsage.this(string[] messages, string file = __FILE__, ulong line = cast(ulong)__LINE__)` is not callable using argument types `(string)` mixin_exception.d(19): cannot pass argument `"Error message."` of type `string` to parameter `string[] messages` Failed: ["/usr/bin/dmd", "-v", "-o-", "mixin_exception.d", "-I."]

```

Why? Why can't I have two constructors when I use mixin?

If I replace mixin to real code, I have no problem:

```
class WrongUsage : Exception {
this(string msg, string file = __FILE__, size_t line = __LINE__) {
        super(msg, file, line);
    }

this(string[] messages, string file = __FILE__, size_t line = __LINE__) {
        auto msg = std.array.join(messages, "\n");
        super(msg, file, line);
    }
}
```

mixin template create scope, for example if it was normal function (no ctor), you can do this:
```d

mixin template RealizeException() {
    static void foo(string){}
}

class WrongUsage{
    mixin RealizeException x;

    alias foo = x.foo;

    static void foo(string[]){}

}

void main() {
    WrongUsage.foo("Error message.");
}
```

But for ctor this doesn't work...

Reply via email to