d同时模板查找名不检查模板外

原文

string ta(string s) { return s ~ "1"; }
template ta(string s) { enum ta = .ta(s); }
void main()
{
    import std.stdio;
    writeln(ta("a"), ' ', ta!"b");
}

预期输出"a1 b1",所以编译器一般可识别符号何时引用函数,何时引用模板,但是如果我在ta*模板内删除ta(s)之前的.号,它会报错:
<src>(2):错误:前向引用ta变量
<src>(6):错误:实例化<src>.ta!"b"模板错误.

这似乎是个(优先级不高)小限制,即在(同名)模板内,查找符号时,不会在模板外查找其他可能匹配符号,且需要在前面加个"."号来告诉它查看顶级符号.

问题是,解析'ta(s)'时,'ta'首先搜索的当前域,而已按枚举定义'ta'符号.因此要加号.替代方法是加特例.
总之,编译器正确的干活,无错误.

posted @ 2023-02-14 10:04  zjh6  阅读(17)  评论(0)    收藏  举报  来源