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.
