On 11/25/2012 07:27 AM, comco wrote:
>
>> A!B(...) defines a struct A with B typed in as Method, so call to
>> method(s); is the same as B(string)
> Why is that? Here method is an instance of the type Method, not the type
> Method itself,

That could be case but you original code did use a type name for Method:

    A!B(B(0));

This would be using an instance:

    B instance;
    A!instance(B(0));

It would not compile because you would be using an instance as a type name in the constructor signature:

    this(Method method) {    // <-- ERROR: Method is an instance
        // ...
    }

> so by saying `method(s)` we can't mean a constructor.
> Something very strange happens...

The situation with constructors and opCall() are still confused. There are a number of bugs open but not exactly this one.

> I have a simpler example now:

Even simpler:

struct A
{
    int i;

    void opCall(int i) {
    }
}

void main() {
    auto a = A(42);
}

Error: variable deneme.main.a type void is inferred from initializer opCall(42), and variables cannot be of type void
Error: expression opCall(42) is void and has no value

The bug is that a non-static opCall() is chosen instead of the default constructor. As you say, non-static opCall() overloads should not interfere with construction.

Could you please create a bug report:

  http://d.puremagic.com/issues/

Ali

Reply via email to