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