2016-05-27 8 views
0

Ich habe vor kurzem begonnen, D zu lernen, und weiterhin Vorlagen. Ich wollte ein kleines Beispiel machen, um das Lesen zu verstärken, aber dann bekomme ich diesen Fehler oben.Dlang Fehler 42: Symbol nicht definiert

Speziell für meinen Code, sagt es:

using_point.obj(using_point) 
Error 42: Symbol Undefined _D6points7_arrayZ --- errorlevel1 

mein Code hier:

module point; 

class Point(Type: long) { 

    public string name; 
    public Type[] locations; 

    alias Type T; 

    this(string name, Type[] magnitudes) { 
     this.name = name; 

     for(int i = 0; i < magnitudes.length; i++) 
       locations ~= magnitudes[i]; 
    } 

    override 
    public string toString() { 
     string output = this.name ~ " = (" ~ this.locations[0]; 

     for(int i = 1; i < locations.length; i++) 
      output ~= "," ~ this.locations[i]; 

     output ~= ")"; 

     return output;  
    } 
} 

und Haupt:

module using_point; 
import std.stdio; 
import point; 


void main() { 
    byte[] mags = [1,2,3]; 
    auto p1 = new Point!byte("P", mags); 
} 

Ich verstehe, dass es ein Verbindungsfehler ist, aber da Ich benutze keine externen Bibliotheken und ich denke, ich habe den Konstruktor für Point richtig definiert, ich kann das p nicht finden Problem.

+0

Was ist Ihr Kompilierungsbefehl? Wenn du dmd main.d point.d klägst - beide Dateien gleichzeitig - sollte es funktionieren ... Wahrscheinlichkeiten sind, dass du sie separat gemacht hast –

+0

Dies ist keine Antwort, aber du verpasst einige '.to! String' Aufrufe in deinem toString-Methode. Überall dort, wo Sie 'this.locations [N]' an einen String anhängen wollen, müssen Sie ihn in 'this.locations [N] .to! String' ändern, wenn Sie möchten, dass Typ oder T etwas anderes ist als string, char oder (u) byte – WebFreak001

+0

Meine Befehle waren "dmd -c point.d", dann "dmd main.d" Huh, seltsam. Ich ging davon aus, dass dies wegen der Importaussage nicht nötig wäre. Und dank WebFreak werde ich dafür sorgen. Ich habe es eigentlich geplant, habe es einfach verteilt. Kennen Sie die Importanweisung? –

Antwort

0

Aus den Kommentaren, erscheinen Sie folgendes ausgeführt werden:

dmd -c point.d 
dmd main.d # presumably contains `import point;` 

Der erste Befehl kompiliert (aber nicht verlinkt) point.d in point.o.

Der zweite Befehl Kompilierungen und verknüpft main.d, und main.d nur, in eine ausführbare Datei. Es schlägt mit einem Fehler "fehlendes Symbol" fehl, da DMD Code für alles, das sich nicht in seiner Befehlszeile befindet, nicht sucht oder generiert. Wenn Sie import points;, importieren Sie nur die Symbole, nicht den tatsächlichen Code.

Um dies zu beheben, entweder ...

  1. Compile points.d zusammen mit main.d:

    dmd main.d points.d 
    
  2. Verbindung mit points.o:

    dmd -c points.d 
    dmd main.d points.o 
    
  3. Oder rdmd verwenden, die werden scannen alle Ihre Importe herauszufinden, was kompiliert werden muss, kompilieren Sie das Programm, und führen Sie es:

    rdmd main.d 
    
+0

Vielen Dank! Das hat das Problem gelöst. –