为什么我不能在类方法中与关联数组链接?

时间:2012-04-28 16:20:16

标签: d

我似乎无法做出这方面的一个小例子,但也许有人会遇到它。

我有一个类Path,方法void find(),当我尝试在方法中实例化一个类型为int[string]的关联数组时,我得到的链接器错误看起来像这样:

/tmp/ccTF0A0c.o: In function `_D6object28__T16AssociativeArrayTAyaTiZ16AssociativeArray6rehashMFNdZHAyai':
game.d:(.text._D6object28__T16AssociativeArrayTAyaTiZ16AssociativeArray6rehashMFNdZHAyai[_D6object28__T16AssociativeArrayTAyaTiZ16AssociativeArray6rehashMFNdZHAyai]+0x44): undefined reference to `_D14TypeInfo_HAyai6__initZ'
collect2: ld returned 1 exit status

如果我将关联数组粘贴在类的成员中,一切看起来都很好。

代码看起来像这样:

class Path
{
    int[string] bar; // Here it works.
    void find()
    {
        int[string] foo; // Here it fails.
    }
}

2 个答案:

答案 0 :(得分:2)

我自己遇到了一个非常类似的问题,一个类存储了一个对象值和字符串键的关联数组。即使上面的问题中的这个例子实际上是 编译(Line:3 int [string] bar; //这里有效。)对我来说它没有,我的编译将失败并显示以下消息:

/tmp/cc8XXyP6.o: In function `_D6object64__T16AssociativeArrayTAyaTC2px5pizza8graphics8textures8MaterialZ16AssociativeArray6rehashMFNdZHAyaC2px5pizza8graphics8textures8Material':
/usr/include/d2/4.6/object.di:366: undefined reference to `_D50TypeInfo_HAyaC2px5pizza8graphics8textures8Material6__initZ'
collect2: ld returned 1 exit status

原来我只是通过在类的构造函数中使用包含单个键/值对的AA文字[key:value]初始化数组来解决它,并且它工作正常。

示例:(不编译)

class Cache {
    Material[string] dict;        
    ...
    Material load(string filename) {
        ... (File I/O and such)
        dict[filename] = loadedMaterial; //Compiler Error?
    }
}

示例:( DOES Compile)

class Cache {
    Material[string] dict;        
    ...
    this() {
        dict = ["notexture" : new Material()]; //Somehow makes all the difference
    }
    ...
    Material load(string filename) {
        ... (File I/O and such)
        dict[filename] = loadedMaterial; //Works fine
    }
}

我认为这个问题并不完全相同,但是对于那些绊倒相同错误消息的人来说可能仍然有用,这是我在谷歌搜索一小时后发现的第一个有意义的问题。

答案 1 :(得分:-1)

你在做增量编译吗? D编译器不支持这一点。 [意见:由于这个问题,D语言永远不会成为主流]