我写了一个实验性的库,在处理数组时,我得到了error: unknown class name 'Exception'; did you mean 'std::exception'
。我该如何解决?
Array.hpp
#ifndef _RFwC__ARRAY_HPP_
#define _RFwC__ARRAY_HPP_
#include "util.hpp"
#include "Object.hpp"
#include "IDefaultType.hpp"
#include "Exception.hpp"
class ArrayException : public Exception {}; // here error
class IndexOutOfRangeException : public ArrayException {};
template<typename T_Value>
class Array : public Object, IDefaultType{
public:
Array(const intnum_t _length);
Array();
// next array code and closing for guard symbols
Exception.hpp
#ifndef _RFwC__EXCEPTION_HPP_
#define _RFwC__EXCEPTION_HPP_
#include "IThrowable.hpp"
#include "Object.hpp"
#include "String.hpp"
class Exception : public Object, IThrowable {
public:
Exception(const String _message, const Exception * _pInner);
Exception(const String _message);
Exception();
const String getMsg() const;
const Exception * getInner() const;
virtual void onThrow();
protected:
String __msg;
const Exception * __pInner;
};
#endif // _RFwC__EXCEPTION_HPP_
输出:
c++ -DPLATFORM_=linux -DCAPACITY_=32 -std=c++11 -fPIC -o obj/core_Exception.cpp.o -c src_Core/Exception.cpp
In file included from src_Core/Exception.cpp:23:
In file included from src_Core/Exception.hpp:26:
In file included from src_Core/IThrowable.hpp:27:
In file included from src_Core/String.hpp:28:
src_Core/Array.hpp:31:31: error: unknown class name 'Exception'; did you mean 'std::exception'?
class ArrayException : public Exception {};
^~~~~~~~~
std::exception
/usr/bin/../lib/gcc/i686-linux-gnu/4.7/../../../../include/c++/4.7/exception:61:9: note: 'std::exception' declared here
class exception
^
1 error generated.
make: *** [core_Exception.cpp.o] Ошибка 1
答案 0 :(得分:3)
您的头文件中有一个循环循环。 “Exception.cpp”包括“Exception.hpp”,其中包括“IThrowable.hpp”,其中包括“String.hpp”,其中再次包含“Exception.hpp”。
这会导致include guard防止第二次包含Exception.hpp,但是当你在String.hpp中使用Exception时,它没有被定义。
有两种常见的解决方案:
在这两者中,#1是首选解决方案,因为它还会减少标头之间的依赖关系,这通常是一件好事。
答案 1 :(得分:0)
Exception.hpp
包含String.hpp
,其尝试重新加入Exception.hpp
;像这样的循环依赖是不可能的。
由于Exception
包含String
,因此必须先包含String.hpp
。因此,您需要更改Exception.hpp
,因此不包括class Exception;
。如果需要类型,则转发声明__msg
,并将需要完整定义的任何代码移动到源文件中。
此外,请勿使用{{1}}之类的reserved names。我不会评论尝试用类似Java的东西替换标准库的智慧;我永远不需要处理那种疯狂,所以这不是我的问题。
答案 2 :(得分:0)
包含之间存在循环依赖关系。
Exception
的前瞻声明将解决问题。
一些未经请求的建议:一个名为Exception
的非限定类型要求发生冲突/混淆。请使名称更具体,或者使用namespace
来限定这个非常全球化的名称。