cristian
cristian

Reputation: 526

Cannot compile project: error in locale.h file

I'm trying to compile a project that has the following header: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

Could anyone give me some suggestions ?

I'm getting this error. I am not sure what is the 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

Upvotes: 6

Views: 2147

Answers (3)

Dazzibao
Dazzibao

Reputation: 610

Consider the following code:

class MyClass;

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

The declaration of MyClass is a forward declaration. All the compiler know is that the class exists (it doesn't know its members, size...), that's why it is called an incomplete type. You can use references or pointers of that class, but that's it. See more info here When can I use a forward declaration?

So it seems that in your code, you only have a forward declaration of LogString type, and not a full declaration. Check your include files and include order so you get the full declaration of this class.

Upvotes: 1

Aconcagua
Aconcagua

Reputation: 25526

What AnT wrote in a comment is the solution to the problem:

<clocale> is including your <locale.h> instead of the system one it ought to do; your locale is trying to include <string>, which again includes <clocale>.

So in the end, you get a circular include as I described in your other question https://stackoverflow.com/questions/32379927/header-file-does-not-compile-locale-h, just the chain being longer...

You need to break this inclusion circle. You can do this by removing the directory the file resides in from the inclusion directories you pass to gcc (I suppose this is -I"/LOGGER/include/log4cxx/helpers"). Instead, you can give a path to the parent directory (-I"/LOGGER/include/"). Instead of #include <locale.h> you would have to use #include <log4cxx/helpers/locale.h>.

Actually, I recommend keeping "/LOGGER/include" as the only directory you give gcc and have all other files you need included via the corresponding subpath - provided the rest of the log4cxx files allow that (which I would assume).

Apart from that, the only other way to solve the problem is indeed renaming your 'locale.h' file to something else (apart from changine the include path division, such as -I"/LOGGER/include/log4cxx" and #include <helpers/locale.h>; the one I chose, however, is the most natural one IMO).

Upvotes: 0

Gilad Pellaeon
Gilad Pellaeon

Reputation: 111

You are using std::basic_string, but there is no include for the appropriate header file:

#include <string>

Upvotes: 0

Related Questions