2015-09-04 18 views
5

Sto provando a compilare un progetto che ha la seguente intestazione: locale.h;Impossibile compilare il progetto: errore nel file 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 

Qualcuno potrebbe darmi qualche suggerimento?

Ho ricevuto questo errore. Non sono sicuro che il problema sia .

/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

Sospetto che la propria intestazione denominata 'locale.h' sia in conflitto con l'intestazione di sistema' locale.h'. Il compilatore sembra includere ** il tuo ** 'locale.h' da' clocale'. Rinomina il tuo 'locale.h' in qualcos'altro per eliminare il conflitto. – AnT

+0

AnT, potrebbe essere che ... come posso escludere la chiamata dell'intestazione di sistema locale.h? – cristian

+0

Non è possibile escludere l'intestazione di sistema. Come mostra lo stack di inclusione, è richiesto dall'intestazione 'string'. Non capisco immediatamente perché l'intestazione lo sovrascriva però ... – AnT

risposta

0

Si utilizza std :: basic_string, ma non c'è includono per il file di intestazione appropriata:

#include <string> 
+0

Gilad, il file: logstring.h include: . Ho aggiunto questo nella domanda. – cristian

1

Si consideri il seguente codice:

class MyClass; 

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

La dichiarazione di MyClass è a forward declaration. Tutto il compilatore sa che la classe esiste (non conosce i suoi membri, le dimensioni ...), per questo è chiamata incomplete type. Puoi usare riferimenti o puntatori di quella classe, ma il gioco è fatto. Vedi maggiori informazioni qui https://stackoverflow.com/questions/553682/when-can-i-use-a-forward-declaration

Quindi sembra che nel tuo codice, hai solo una dichiarazione in avanti di tipo LogString, e non una dichiarazione completa. Controlla i tuoi file include e includi l'ordine in modo da ottenere la dichiarazione completa di questa classe.

+0

Dazzibao, grazie per la spiegazione. Cercherò di trovare la dichiarazione completa. Un'altra cosa è che questo codice è in fase di compilazione su VisualStudio (Windows) ... questi errori si verificano su Eclipse-linux ... anzi potrebbe essere un file di inclusione che mi è sfuggito. – cristian

+0

Dazzibao, posso cercare qualcosa di specifico? per trovare la dichiarazione completa ... Tutto quello che ho trovato è un sacco di riferimenti .... – cristian

+0

LogString è un typedef per std :: basic_string , che ha dichiarato nel file incluso - quindi questo non può essere il problema - se fosse per log char non essendo definito, l'errore di compilazione sarebbe stato mostrato al typedef (quindi una di queste macro sopra l'abilitazione del log di log deve essere definita). – Aconcagua

0

Cosa AnT ha scritto in un commento è la soluzione al problema:

<clocale> è compreso il vostro <locale.h> al posto del sistema lo si deve fare; la tua localizzazione sta cercando di includere la stringa < >, che include ancora <clocale>.

Così, alla fine, si ottiene una circolare comprendono come ho descritto nella tua altra domanda https://stackoverflow.com/questions/32379927/header-file-does-not-compile-locale-h, solo la catena di essere più a lungo ...

è necessario rompere questo circolo inclusione. Puoi farlo rimuovendo la directory in cui risiede il file dalle directory di inclusione che passi a gcc (suppongo che questo sia -I "/ LOGGER/include/log4cxx/helper"). Invece, puoi dare un percorso alla directory genitore (-I "/ LOGGER/include /"). Invece di #include <locale.h> dovresti usare #include <log4cxx/helper/locale.h>.

In realtà, si consiglia di mantenere "/ LOGGER/include" come unica directory che si fornisce a gcc e di avere tutti gli altri file necessari inclusi tramite il percorso secondario corrispondente, a condizione che il resto dei file log4cxx lo consenta (cosa che presumerei) .

Oltre a ciò, l'unico altro modo per risolvere il problema è infatti rinominare il file 'locale.h' in qualcos'altro (a parte il changine della divisione del percorso di inclusione, come -I "/ LOGGER/include/log4cxx" e #include <helper/locale.h>; quello che ho scelto, tuttavia, è il più naturale IMO).

Problemi correlati