d前向引用问题
alias aliases(a...) = a;
template sort(alias f, a...) {
static if (a.length > 0) {
alias x = f!(a[0]);
alias sort = a;
}
else
alias sort = a;
}
alias SortedItems = sort!(isDependencyOf, String);
enum isDependencyOf(Item) = Item.DirectDependencies.length == 0;
struct String {
alias DirectDependencies = aliases!();
enum l = SortedItems.length; // 无`length`属性
}
怀疑实例化排序模板时,它太急于计算它的参数,它应该只看到String是个结构,而未语义化它的内容.
修复
似乎,第一次"模板排序"时,它不能设置"alias decl",因为这两个"别名排序"赋值在条件编译之后隐藏.
因此'alias decl'为null.
因此,在'struct String'的语义中,它遇见了'SortedItems.length'.'alias decl'为null,所以'SortedItems'变为'sort!(...)',而'sort!(...)'变为'void',而'void'没有'length'.
或许可通过注意'static if'成员是否是模板中唯一成员这个事实,这样它就可急切求值了?
查看扩展成员,也许可分两趟完成,一次是顶级条件编译,然后检查单个成员,然后再检查其余.
浙公网安备 33010602011771号