2015-09-04 13 views
5

Próbuję skompilować projekt, który ma następujący nagłówek: locale.h;Nie można skompilować projektu: błąd w pliku locale.h

locale.h:

class LOG4CXX_EXPORT Locale 
{ 
public: 
     ... 

protected: 
    Locale(const Locale&); 
    Locale& operator=(const Locale&); 
    const LogString language; <-- error 
    const LogString country; <-- error 
    const LogString variant; <-- error 
}; // class Locale 

Czy ktoś może dać mi jakieś sugestie?

Otrzymuję ten błąd. Nie jestem pewien jaki jest problem.

/LOGGER/include/log4cxx/helpers/locale.h:42:41: error: field ‘language’ has incomplete type 
        const LogString language; 
            ^
/LOGGER/include/log4cxx/helpers/locale.h:43:41: error: field ‘country’ has incomplete type 
        const LogString country; 
            ^
/LOGGER/include/log4cxx/helpers/locale.h:44:41: error: field ‘variant’ has incomplete type 
+0

Podejrzewam, że twój własny nagłówek o nazwie 'locale.h' koliduje z nagłówkiem systemu' locale.h'. Wydaje się, że kompilator zawiera ** twoje ** 'locale.h' z' clocale'. Zmień nazwę swojego 'locale.h' na coś innego, aby wyeliminować konflikt. – AnT

+0

AnT, może być tak ... jak mogę wykluczyć wywołanie nagłówka systemu locale.h? – cristian

+0

Nie można wykluczyć nagłówka systemu. Jak pokazuje stos zawierający stos, jest wymagany przez nagłówek 'string'. Nie rozumiem od razu, dlaczego twój nagłówek nadpisuje to ... – AnT

Odpowiedz

0

Używasz std :: basic_string, ale nie ma to dla odpowiedniego pliku nagłówka:

#include <string> 
+0

Gilad, plik: logstring.h obejmuje: . Dodałem to w pytaniu. – cristian

1

Rozważmy następujący kod:

class MyClass; 

int method1(const MyClass& param); 
MyClass& method2(); 
const MyClass instance; // <- error here 

Deklaracja MojaKlasa jest a forward declaration. Cały kompilator wie, że klasa istnieje (nie zna swoich członków, rozmiaru ...), dlatego nazywa się ją incomplete type. Możesz użyć referencji lub wskaźników tej klasy, ale to wszystko. Zobacz więcej informacji tutaj https://stackoverflow.com/questions/553682/when-can-i-use-a-forward-declaration

Tak więc wydaje się, że w kodzie masz tylko deklarację typu "forward" o numerze LogString, a nie pełną deklarację. Sprawdź swoje pliki włączeń i dodaj zamówienie, aby uzyskać pełną deklarację tej klasy.

+0

Dazzibao, dziękuję za wyjaśnienia. Postaram się znaleźć pełną deklarację. Inną sprawą jest to, że ten kod kompiluje się na VisualStudio (Windows) ... te błędy dostaję na Eclipse-linux ... w rzeczywistości może to być plik dołączany, który przeoczyłem. – cristian

+0

Dazzibao, czy mogę wyszukać coś konkretnego? aby znaleźć pełną deklarację ... Wszystko, co znalazłem, to wiele odniesień ... – cristian

+0

LogString to typedef dla std :: basic_string , który zadeklarował w dołączonym pliku - więc to nie może być problem - gdyby było log char nie jest zdefiniowany, błąd kompilacji zostałby pokazany w typedef (więc każde z powyższych makr powyżej włączania log char musi być zdefiniowane). – Aconcagua

0

Co AnT napisał w komentarzu jest rozwiązanie problemu:

<CLocale> jest w tym swój <locale.h> zamiast jednego systemu to powinniśmy zrobić; Twoja lokalizacja próbuje dodać <string>, który ponownie zawiera <clocale>.

Więc w końcu, można uzyskać okrągły to co opisałem w drugim pytaniu https://stackoverflow.com/questions/32379927/header-file-does-not-compile-locale-h, tylko łańcuch jest już ...

Trzeba przerwać ten krąg integracji. Możesz to zrobić, usuwając katalog, w którym znajduje się plik z katalogów dołączanych do gcc (przypuszczam, że jest to -I "/ LOGGER/include/log4cxx/helpery"). Zamiast tego możesz podać ścieżkę do katalogu nadrzędnego (-I "/ LOGGER/include /"). Zamiast #include <locale.h> będziesz musiał użyć #include <log4cxx/helpers/locale.h>.

Właściwie zalecam, aby "/ LOGGER/include" był jedynym katalogiem, który podałeś gcc i aby wszystkie pozostałe pliki były dołączone przez odpowiednią ścieżkę podrzędną - o ile pozostałe pliki log4cxx na to pozwalają (co bym zakładał) .

Oprócz tego, jedynym innym sposobem rozwiązania problemu jest zmiana nazwy pliku "locale.h" na coś innego (poza zmianą podziału ścieżek, na przykład -I "/ LOGGER/include/log4cxx" i #include <helpers/locale.h>; ten, który wybrałem, jest najbardziej naturalnym IMO).

Powiązane problemy