2012-04-28 11 views
1

私はこれの小さな例を作っているようには見えませんが、誰かがそれに前に走っているかもしれません。クラスメソッドで連想配列にリンクできないのはなぜですか?

私は方法void find()で、クラス、Pathを持っていると私はメソッドの内部タイプ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. 
    } 
} 
+0

私は再現できません。あなたの例をvoid main(){}でコンパイルできますか?またはrdmd --main game.d –

+0

私の例では問題は発生しません。私は比較的大きなプロジェクトからそれを分けているようには見えません。 – nmichaels

+0

さて、あなたは実際に失敗した例を提供する必要があるか、またはあなたを助けるのが非常に困難になるでしょう。あなたのローカルセットアップに奇妙なリンカの問題がある可能性があります。コンパイラのバグに遭遇した可能性があります。コードを少しだけ減らして、コードに実際の問題がある可能性がありますあなたがコードを減らしたときに問題のコードを取り除いたので、指摘できません。 –

答えて

-1

あなたはインクリメンタルコンパイルをやっている:

のコードは次のようになりますか? Dコンパイラはこれをサポートしていません。 [意見:この問題のため、D言語は決して主流になりません]

+0

いいえ、すべてをまとめてコンパイルしてください。 – nmichaels

+0

正しくリコールすれば、すべてのデータを一度に与えたときにコンパイラがショートカットを取る可能性があるため、パフォーマンス上の問題がありました。しかし、コンパイラは増分コンパイルが可能です。 –

+0

これは間違っています。 DMDは増分コンパイルを行い、-cオプションを使用するだけです。それは非常に速いので、私は心配することはありませんでした。 –

2

私はオブジェクト値と文字列キーの連想配列を格納しているクラスで非常に似た問題を抱えていました。実際上記の質問では、この例では、コンパイルをしたにもかかわらず(ライン:3 INT [文字列]バー; //ここではそれが動作します)私のためにそれは、私のコンパイルは、このメッセージで失敗しませんでした:

/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? 
    } 
} 

例:(コンパイルを行います)

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

関連する問題