2012-04-28 3 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 
    } 
} 

은 그렇진 같은 문제는 생각하지만 여전히 사람과 주위에 비틀에 유용 할 수 있습니다 같은 오류 메시지, 이것은 내가 한 시간 동안 인터넷 검색을 통해 발견 한 첫 번째 의미있는 질문이었습니다.

관련 문제