Gcc / clang:错误:未知的类名'Exception';你的意思是'std :: exception'

时间:2013-10-09 13:00:56

标签: c++ linux gcc c++11

我写了一个实验性的库,在处理数组时,我得到了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

3 个答案:

答案 0 :(得分:3)

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

这会导致include guard防止第二次包含Exception.hpp,但是当你在String.hpp中使用Exception时,它没有被定义。

有两种常见的解决方案:

  1. 在String.hpp中使用Exception的前向声明,不要在那里#include它。这将允许您使用String.hpp头文件中的类型,而不会出现问题。然后,您将#include放入String.cpp
  2. 重新排列头文件,以便您没有循环依赖项。这并不总是可行,但通常涉及采用通用代码并将其放在其他地方。
  3. 在这两者中,#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来限定这个非常全球化的名称。