2009-10-27 2 views
5

Mon problème est que lorsque je veux faire une bibliothèque téléchargée, je reçois quelques erreurs de compilation bizarres de GCC et le code que le compilateur demande de corriger semble juste être juste.Erreur de compilation GCC: la déclaration de 'strlen' doit être disponible

Les erreurs sont comme ceci:

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

Voici le code autour de la ligne 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; 
} 

Que puis-je faire pour corriger ces erreurs de compilation?

+0

Il semble que vous ayez un ensemble de globaux dont les noms correspondent à '_ [a-z]. *', Ces noms sont réservés à l'implémentation. ('_ [a-z]. *' est OK pour les noms non-globaux tels que les variables locales et les membres de la classe) – MSalters

+0

Je ne pense pas qu'ils soient globaux - mais plutôt des variables membres. Je suppose que GaCatalogueEntry est une fonction membre dans une classe modélisée. Mais vous avez raison, il est dangereux d'avoir une convention de nommage qui implique des préfixes de soulignement. Pour les variables membres, il est préférable d'utiliser le préfixe m_ ou le suffixe _. –

Répondre

3

Le code est buggé. Il vous manque probablement un #include <string.h>.

Si vous ne souhaitez pas modifier le code, ajoutez -fpermissive aux options du compilateur. (Voir le GCC documentation.)

10

Vous avez probablement juste besoin d'inclure l'en-tête qui contient les fonctions de bibliothèque strcpy et strlen.

#include <string.h> 

ou (de préférence pour C++)

#include <cstring> 
+1

beaucoup mieux! (et vous devez utiliser std :: strlen() au lieu de simplement strlen). – Ben

4

En C++ la fonction Les strlen() fait partie de la bibliothèque de chaîne, et il ressemble presque le fichier d'en-tête n'a pas été inclus.

Est-il inclus partout?

include <string.h> 

Sinon, essayez de l'ajouter et de voir si cela résout le problème.

+0

Oui, le problème était le fichier d'en-tête manquant. mais je pense que les messages d'erreur ne sont pas aussi importants que les langages tels que Java. – Navid

+1

Dans ce cas, la cause de l'erreur était quelque peu obscurcie par le fait que le code faisait partie d'un modèle. Le compilateur a trouvé un symbole non identifié dans le modèle, qui n'aurait même pas provoqué d'erreur jusqu'à ce que le modèle soit réellement instancié si le symbole non identifié dépendait du paramètre modèle T (par exemple si le symbole ressemblait à T :: dosomething ()) –

1

a declaration of ‘strlen’ must be available

Inclure string.h ou <cstring> (C++) pour la déclaration de strlen().

Questions connexes