2009-10-27 3 views
5

Mein Problem ist, dass ich, wenn ich eine heruntergeladene Bibliothek erstellen möchte, einige seltsame Kompilierfehler von GCC bekomme und der Code, den der Compiler korrigieren möchte, scheint genau richtig zu sein.GCC-Kompilierfehler: Deklaration von 'strlen' muss verfügbar sein

Die Fehler sind wie folgt aus:

Catalogue.h:96: error: there are no arguments to ‘strlen’ that depend on a template parameter, so a declaration of ‘strlen’ must be available

Hier ist der Code um Zeile 96:

GaCatalogueEntry(const char* name, T* data) 
{ 
    if(name) 
    { 
     _nameLength = (int)strlen(name); // LINE 96 

     // copy name 
     _name = new char[ _nameLength + 1 ]; 
     strcpy(_name, name);  // LINE 100: similar error 

     _data = data; 

     return; 
    } 

    _name = NULL; 
    _nameLength = 0; 
    _data = NULL; 
} 

Was kann ich tun, diese Fehler zu kompilieren zu beheben?

+0

Es scheint, dass Sie eine Gruppe von Globals mit Namen haben, die '_ [a-z]. *' Entsprechen, diese Namen sind für die Implementierung reserviert. ('_ [a-z]. *' ist OK für nicht-globale Namen wie lokale Variablen und Klassenmitglieder) – MSalters

+0

Ich glaube nicht, dass sie globale - sondern Mitgliedsvariablen sind. Ich vermute, GaCatalogueEntry ist eine Member-Funktion in einer Template-Klasse. Aber Sie haben Recht, es ist gefährlich, eine Namenskonvention zu haben, die Unterstrichpräfixe beinhaltet. Für Mitgliedsvariablen ist es besser, das Präfix m_ oder das Suffix _ zu verwenden. –

Antwort

3

Der Code ist fehlerhaft. Sie vermissen wahrscheinlich eine #include <string.h>. Wenn Sie den Code nicht ändern möchten, fügen Sie -fpermissive zu den Compileroptionen hinzu. (Siehe GCC documentation.)

10

Sie müssen wahrscheinlich nur die Kopfzeile einfügen, die die Funktionen strcpy und strlen enthält.

#include <string.h> 

oder (vorzugsweise für C++)

#include <cstring> 
+1

viel besser! (Und Sie müssen std :: strlen() statt nur strlen verwenden). – Ben

4

In C++ die Funktion strlen() Teil der String-Bibliothek ist, und es sieht fast aus wie die Header-Datei nicht enthalten war.

Ist es irgendwo enthalten?

Wenn nicht, versuchen Sie es hinzuzufügen und sehen, ob das das Problem behebt.

+0

Ja, das Problem war die fehlende Header-Datei. aber ich denke, Fehlermeldungen sind nicht so führend wie Sprachen wie Java. – Navid

+1

In diesem Fall wurde die Ursache des Fehlers durch die Tatsache verschleiert, dass der Code Teil einer Vorlage war. Der Compiler hat ein unidentifiziertes Symbol in der Vorlage gefunden, das nicht einmal einen Fehler verursacht hätte, bis die Vorlage tatsächlich instanziiert wurde, wenn das nicht identifizierte Symbol vom Template-Parameter T abhängig war (zB wenn das Symbol etwas wie T :: dosomething ()) –

1

a declaration of ‘strlen’ must be available

einschließen string.h oder <cstring> (C++) zur Deklaration von strlen().