无法编译项目:locale.h文件中的错误

时间:2015-09-04 08:05:39

标签: c++ header c-preprocessor

我正在尝试编译一个具有以下标题的项目: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

有人能给我一些建议吗?

我收到了这个错误。我不确定 是什么问题。

/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

3 个答案:

答案 0 :(得分:1)

请考虑以下代码:

class MyClass;

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

MyClass的声明是forward declaration。所有编译器都知道该类存在(它不知道它的成员,大小......),这就是它被称为incomplete type的原因。您可以使用该类的引用或指针,但就是这样。在此处查看更多信息https://stackoverflow.com/questions/553682/when-can-i-use-a-forward-declaration

因此,在您的代码中,您似乎只有LogString类型的前向声明,而不是完整声明。检查您的包含文件并包含订单,以便获得此类的完整声明。

答案 1 :(得分:0)

您正在使用std :: basic_string,但没有包含适当的头文件:

#include <string>

答案 2 :(得分:0)

AnT在评论中写道的是解决问题的方法:

&LT; clocale&GT;包含你的&lt; locale.h&gt;而不是它应该做的系统;您的区域设置正在尝试包含&lt; string&gt;,其中又包含&lt; clocale&gt;。

所以最后,你得到了我在你的另一个问题https://stackoverflow.com/questions/32379927/header-file-does-not-compile-locale-h中所描述的循环包含,只是链条更长......

您需要打破此包含圈。您可以通过从传递给gcc的包含目录中删除文件所在的目录来实现此目的(我想这是-I&#34; / LOGGER / include / log4cxx / helpers&#34;)。相反,您可以提供父目录的路径(-I&#34; / LOGGER / include /&#34;)。而不是#include&lt; locale.h&gt;你必须使用#include&lt; log4cxx / helpers / locale.h&gt ;.

实际上,我建议保留&#34; / LOGGER / include&#34;作为唯一的目录,你给gcc并通过相应的子路径包含你需要的所有其他文件 - 只要其余的log4cxx文件允许(我假设)。

除此之外,解决问题的唯一方法就是重命名你的locale.h&#39;归档到其他东西(除了changine包含路径分区,例如-I&#34; / LOGGER / include / log4cxx&#34;和#include&lt; helpers / locale.h&gt ;;我选择的那个是最自然的一个IMO)。