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