On 2013-05-07 08:41, Meta wrote:
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?

As a workaround for "typeof" you can use this:

https://github.com/jacob-carlborg/orange/blob/master/orange/util/Traits.d#L213

--
/Jacob Carlborg

Reply via email to