Hm... why is this giving a forward reference error?

int main()
{
    auto a = normal(5);
    auto b = a + a;
    writeln(b.get(0.0));
}

struct OpBinary(string op, T...) if (T.length == 2)
{
    T values;

    this(T values) { this.values = values; }

    auto ref get(T2...)(T2 args)
    {
        static assert(T.length == 2);
return (mixin(q{this.values[0]} ~ op ~ q{this.values[1]})).get(args); // Why is calling get() considered a "forward reference"?
    }
}

struct Normal(T = real)
{
    T mean, stddev;

this(T mean = 0, T stddev = 0) { this.mean = mean; this.stddev = stddev; }

    auto get(T2)(T2 value)
    {
        auto variance = this.stddev * this.stddev;
        auto offset = value - this.mean;
return variance == 0.0 ? this.mean == value : .std.math.exp(-(offset * offset) / (2.0 * variance)) / .std.math.sqrt(2.0 * PI * variance);
    }

    OpBinary!(op, typeof(this), T2) opBinary(string op, T2)(T2 other) const
        if (op == "+" || op == "-" || op == "*" || op == "/")
    {
        return typeof(return)(this, other);
    }
}

auto normal(T)(T value) { real v = value; return Normal!(T)(v); }

Reply via email to