2016-10-07 38 views
1

读我有这样的代码:变量i不能在编译时

class Set(T){ 
    private T[] values; 

    T get(uint i){ 
     return ((i < values.length) ? T[i] : null); 
    } 
... 

,当我尝试使用这个类是这样的:

set.Set!(int) A; 

编译器在return行给出错误:set.d|9|error: variable i cannot be read at compile time

有人可以解释,我的代码有什么问题?谢谢。

+0

确定这是所有的代码? –

+1

不管怎么说'T [i]'行是错误的,T是一个类型,这个数组是'values' –

+1

你也许意味着'价值[i]'? – rcorre

回答

0

这就是答案:代码只是引用了错误的变量。它给出错误的原因是T [i]试图从编译时类型列表中获取索引......这需要我在编译时也可用。但是,由于我是一个常规变量,它不是。 (你可以有编译时变量btw--函数的结果可能是CT逃避的,或者是在一个静态列表上的foreach上的索引,或者是一个枚举值。)然而,这里想要的是数组中的运行时索引。 ..所以这些值是正确的符号,因为它是数据而不是类型。

作者:Adam D. Ruppe

+0

这就是答案:代码简单地引用了错误的变量。它给出错误的原因是'T [i]'试图从一个编译时类型列表中获得一个索引......在编译时也需要'i'。但是,由于'i'是一个常规变量,它不是。 (你可以有编译时变量btw--函数的结果可能是CT逃避的,或者是在一个静态列表上的foreach上的索引,或者是一个'enum'值。)然而,这里想要的是运行时索引数组...因此'values'是正确的符号,因为它是数据而不是类型。 –

+0

对于这个特殊的错误,这是一个真正可怕的错误信息。你对编译器@ AdamD.Ruppe能否/应该特别说明这个问题有什么意见吗? – Meta

+0

呃可能但是很难判断它是否是一个有意识的下标或者不是......呃,实际上,T在这里甚至对下标都是无效的,所以它可能应该是一个类型错误,不需要特殊的外壳。但如果它是'T ...',那么这个错误可能是正确的。 –