为什么我没有获得声明者的标识符....?
mixin
在这种情况下没用,但这只是我问题的最小例子。
tl
var是TL
的类型,所以我看不出问题出在哪里。
代码也在dpaste上,与dmd或ldc相同。
感谢您的帮助
import std.stdio;
import std.typecons;
struct Data{
int x;
int y;
}
template getcode(T)
{
mixin(`
alias TL = Tuple!(
int,"x",
int,"y"
);
`);
TL tl;
mixin(`
tl.x = 10;
tl.y = 5;
`);
}
void main()
{
getcode!Data;
writeln( tl.x );
}
答案 0 :(得分:1)
您的问题是模板只能包含声明,而不能包含语句或表达式。这是违法的代码:
mixin(`
tl.x = 10;
tl.y = 5;
`);
这些是作业,而不是声明。这就是为什么你得到奇怪的错误消息“错误:没有声明者tl.x的标识符”。编译器认为您正在尝试声明变量,并且找不到类型“tl.x”......或类似的东西。解决方案是将元组的值设置为内联,如下所示:
template getcode(T)
{
mixin(`alias TL = Tuple!(int, "x", int, "y");`);
TL tl = TL(10, 5);
}
或者,为了更好地匹配您的原始代码:
template getcode(T)
{
mixin(`alias TL = Tuple!(int, "x", int, "y");`);
TL tl = mixin(`TL(10, 5)`);
}
现在还有另一个问题。在main中,您实例化模板,您将收到错误“错误:getcode!(数据)无效”。这是因为模板实例化本身不是声明。您必须将其别名为符号,或使用mixin语句将其混合。
将其别名化为符号将允许您通过该符号访问模板内的声明,并将其混合将模板的声明放入其实例化的范围中。我建议使用第一个选项,因为它更具卫生性。除非绝对必要,否则不应使用mixin
。
void main()
{
//Error: getcode!(Data) has no effect
//getcode!Data;
//Ok
//mixin getcode!Data;
//writeln( tl.x );
//Ok
alias Code = getcode!Data;
writeln( Code.tl.x );
}
您可以在此处查看我更正的代码版本: