2009-10-27 13 views
5

Mój problem polega na tym, że kiedy chcę pobrać pobraną bibliotekę, otrzymuję dziwne błędy kompilacji od GCC, a kod, który kompilator żąda poprawienia, wydaje się słuszny.Błąd kompilacji GCC: deklaracja 'strlen' musi być dostępna

Błędy są tak:

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

Oto kod wokół linii 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; 
} 

Co mogę zrobić, aby naprawić te błędy kompilacji?

+0

Wygląda na to, że masz zestaw globałów o nazwach pasujących do '_ [a-z]. *", Te nazwy są zarezerwowane dla implementacji. ('_ [a-z]. *' jest poprawne w przypadku nazw nie globalnych, takich jak zmienne lokalne i elementy klasy) – MSalters

+0

Nie sądzę, że są to globale, ale raczej zmienne składowe. Zgaduję, że GaCatalogueEntry jest funkcją składową w klasie szablonowej. Ale masz rację, niebezpiecznie jest mieć konwencję nazewnictwa, która obejmuje prefiksy podkreślenia. W przypadku zmiennych składowych lepiej jest użyć przedrostka m_ lub sufiksu _. –

Odpowiedz

3

Kod jest błędny. Prawdopodobnie brakuje Ci #include <string.h>.

Jeśli nie chcesz zmieniać kodu, dodaj -fpermissive do opcji kompilatora. (Zobacz GCC documentation.)

10

Najprawdopodobniej wystarczy dołączyć nagłówek zawierający funkcje biblioteki strcpy i strlen.

#include <string.h> 

lub (najlepiej dla C++)

#include <cstring> 
+1

znacznie lepiej! (i musisz użyć std :: strlen() zamiast tylko strlen). – Ben

4

w C++ z strlen() jest częścią biblioteki strun, a to prawie wygląda jak plik nagłówka nie została uwzględniona.

Czy zawiera się w dowolnym miejscu?

include <string.h> 

Jeśli nie, spróbuj dodać i sprawdź, czy to rozwiąże problem.

+0

Tak, problemem był brakujący plik nagłówkowy. ale myślę, że komunikaty o błędach nie są tak wiodące jak języki takie jak java. – Navid

+1

W tym przypadku przyczyna błędu została nieco zaciemniona przez fakt, że kod był częścią szablonu. Kompilator znalazł niezidentyfikowany symbol w szablonie, który nawet nie spowodowałby błędu, dopóki szablon nie został faktycznie utworzony, gdyby niezidentyfikowany symbol był zależny od parametru szablonu T (np. Gdyby symbol był podobny do T :: dosomething ()) –

1

a declaration of ‘strlen’ must be available

Dołącz string.h lub <cstring> (C++) dla deklaracji strlen().

Powiązane problemy