2009-10-27 12 views
5

Mi problema es que cuando quiero hacer una biblioteca descargada obtengo algunos errores de compilación extraños de GCC y el código que el compilador exige corregir parece ser el correcto.GCC error de compilación: la declaración de 'strlen' debe estar disponible

Los errores son todas como esta:

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

Este es el código alrededor de la línea 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; 
} 

¿Qué puedo hacer yo para corregir estos errores de compilación?

+0

Parece que tienes un conjunto de globales con nombres que coinciden con '_ [a-z]. *', Esos nombres están reservados para la implementación. ('_ [a-z]. *' está bien para nombres no globales como variables locales y miembros de la clase) – MSalters

+0

No creo que sean globales, sino variables de miembros. Supongo que GaCatalogueEntry es una función miembro en una clase de plantilla. Pero tiene razón, es peligroso tener una convención de nomenclatura que incluya prefijos de subrayado. Para las variables miembro, es mejor usar el prefijo m_ o el sufijo _. –

Respuesta

3

El código es defectuoso. Probablemente te pierdas un #include <string.h>.

Si no desea cambiar el código, agregue -fpermissive a las opciones del compilador. (Consulte GCC documentation.)

10

Probablemente solo necesite incluir el encabezado que contiene las funciones de biblioteca strcpy y strlen.

#include <string.h> 

o (preferiblemente de C++)

#include <cstring> 
+1

mucho mejor! (y debe usar std :: strlen() en lugar de simplemente strlen). – Ben

4

En C++ los strlen() es parte de la biblioteca de cadenas, y que casi parece que no se incluyó el archivo de cabecera.

¿Está incluido en algún lugar?

include <string.h> 

Si no es así, trate de añadir y ver si se soluciona el problema.

+0

Sí, el problema era el archivo de encabezado faltante. pero creo que los mensajes de error no son tan importantes como los idiomas como Java. – Navid

+1

En este caso, la causa del error fue ofuscada por el hecho de que el código era parte de una plantilla. El compilador encontró un símbolo no identificado en la plantilla, que ni siquiera causaría un error hasta que la plantilla se instanciara realmente si el símbolo no identificado dependía del parámetro de plantilla T, (por ejemplo, si el símbolo era algo así como T :: dosomething () –

1

a declaration of ‘strlen’ must be available

Incluir string.h o <cstring> (C++) para la declaración de strlen().

Cuestiones relacionadas