template Test(alias N)
if (isIntegral!(typeof(N)))
{
    struct S
    {
        typeof(N) n = N;

        auto opAdd(T)(T rhs)
        {
            //Error: argument S to typeof is not an expression
            pragma(msg, typeof(T));
            //Error: variable rhs cannot be read at compile time
            return Test!(n + rhs.n);
        }
    }
    auto st = S(N);
    alias Test = st;
}

void main()
{
    auto a = Test!2;
    auto b = Test!3;
    writeln(typeof(a).stringof ~ " a = ", a, ", ",
            typeof(b).stringof ~ " b = ", b, ", ",
            typeof(a + b).stringof ~ " a + b = ");
}

I don't really understand why either of these error messages are occurring. The first is just incomprehensible, and the second seems like it should work. In this case, rhs is fully accessible at compile time in the expression (a + b), so why does the compiler complain?

Reply via email to