2

我已经编写了一个实验库,并且正在研究我已经得到的 Array error: unknown class name 'Exception'; did you mean 'std::exception'。我该如何解决?

数组.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

异常.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
4

3 回答 3

3

您的头文件中有一个循环循环。“Exception.cpp”包括“Exception.hpp”,其中包括“IThrowable.hpp”,其中“String.hpp”又包括“Exception.hpp”。

这会导致包含守卫阻止 Exception.hpp 的第二次包含,但是当您在 String.hpp 中使用 Exception 时,它没有定义。

有两种常见的解决方案:

  1. 在 String.hpp 中使用 Exception 的前向声明,并且不要在其中 #include 它。这将允许您使用 String.hpp 头文件中的类型,而问题较少。然后,您将 #include 放入 String.cpp
  2. 重新排列头文件,使您没有循环依赖。这并不总是可能的,但通常涉及获取公共代码并将其放置在其他地方。

在这两者中,#1 是首选解决方案,因为它还会减少标题之间的依赖关系,这通常是一件好事。

于 2013-10-09T13:08:59.290 回答
0

Exception.hpp包括String.hpp,它试图重新包括Exception.hpp;像这样的循环依赖是不可能的。

由于Exception包含 a String,因此第一个包含是必要的。因此,您需要进行更改String.hpp,使其不包括Exception.hpp. 如果需要类型,则 forward-declare class Exception;,并将需要完整定义的任何代码移动到源文件中。

另外,不要使用保留名称,例如__msg. 我不会评论尝试用看起来像 Java 的东西替换标准库的智慧。我永远不需要处理那种精神错乱,所以这不是我的问题。

于 2013-10-09T13:09:18.970 回答
0

包含之间存在循环依赖关系。

提前声明Exception将解决问题。

一些不请自来的建议:一个不合格的类型被称为Exception要求碰撞/混淆。请使名称更具体或使用 anamespace来限定这个听起来非常全球化的名称。

于 2013-10-09T13:11:28.377 回答