为什么我没有声明者的标识符....?

时间:2014-06-04 15:44:23

标签: d

为什么我没有获得声明者的标识符....?

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 );
}

1 个答案:

答案 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 );
}

您可以在此处查看我更正的代码版本:

http://dpaste.dzfl.pl/f6152a35bfc8