Argument S to typeof is not an expression

Anonimous tr1 at google.com
Tue May 7 00:17:31 PDT 2013


On Tuesday, 7 May 2013 at 06:41:25 UTC, 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?

First error occures,because typeof(T) is undefined - T is a
type,not value.
About second error,although in this case rhs is
accessible,compiler can't know
that you won't call this function in runtime,so it's expected -
it's just ordinary function.


More information about the Digitalmars-d-learn mailing list