1

これの小さな例を作ることはできないようですが、誰かが以前に遭遇したことがあるかもしれません。

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.
    }
}
4

2 に答える 2

2

オブジェクト値と文字列キーの連想配列を格納するクラスで、非常によく似た問題が発生しました。上記の質問のこの例は実際にコンパイルされましたが(Line:3 int[string] bar; // Here it works.) 私にとってはそうではありませんでしたが、私のコンパイルは次のメッセージで失敗しました:

/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 コンパイル)

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時間グーグルした後に見つけた最初の意味のある質問でした.

于 2013-11-22T06:41:32.167 に答える
-1

インクリメンタル コンパイルを実行していますか? D コンパイラはそれをサポートしていません。[意見: この問題が原因で、D 言語が主流になることはありません]

于 2012-05-01T20:07:51.953 に答える