【问题标题】:Forward-declaring a custom type of another namespace in a header file在头文件中前向声明另一个命名空间的自定义类型
【发布时间】:2017-09-25 00:06:22
【问题描述】:

我正在使用一个名为 custom 的外部库(不是实际名称),它在自己的命名空间中定义了许多数据类型。假设命名空间也被命名为custom

我正在尝试使用名为DataType 的数据类型。 DataType 是使用 typedef 定义的自定义类型,假设通过包含 "custom/datatype.h" 可以在 .cpp 文件中使用它

我的代码有以下设置。

action.h:

class Action
{
    Action() {}
    virtual ~Action() {}

    virtual void foo(custom::DataType*) const = 0;
    ...
}

some_action.h:

#include "action.h"

class SomeAction : public Action
{
    SomeAction() {}

    virtual void foo(custom::DataType*) const override;
    ...
}

some_action.cpp:

#include "some_action.h"
#include "custom/datatype.h"
...
void SomeAction::foo(custom::DataType*) const
{
    ...
}

除了在action.h 中包含"custom/datatype.h" 之外,还有什么适当的方法可以在action.hsome_action.h 中转发声明DataType

【问题讨论】:

  • 你的代码能编译吗?在 action.h 中,您至少需要 DataType 的前向声明
  • @tobi303 我的代码确实无法编译。这就是为什么我要问如何处理这个问题。如果我按当前的方式编译代码,编译器会认为头文件中的customDataType 未定义。如果我按照 Vittorio Romeo 的回复中的建议进行前向声明,我会收到另一个错误。 (有关实际错误,请参阅我对他的回复的评论)
  • 在这种情况下,您应该在问题中包含错误消息

标签: c++


【解决方案1】:

除了在action.h 中包含"custom/datatype.h" 之外,还有什么合适的方法可以在action.hsome_action.h 中定义DataType

您可能不想“定义” DataType,而是要"forward declare" 它。这使您可以让编译器知道稍后将定义的custom::DataType

您可以通过以下方式实现此目的。在action.hsome_action.h 添加以下前向声明

namespace custom { class DataType; }

在需要DataType 定义的.cpp 文件中,包括"custom/datatype.h"


如果custom::DataType类型别名 (即typedef,则需要包含标题。没有前向声明类型别名的方法:有关相关信息,请参阅 this question & answers

【讨论】:

  • 正如我在问题中提到的,它是由 typedef 定义的。它的定义实际上基于自定义(即库)中使用的一些其他内部数据类型,这些数据类型也在命名空间custum 中。因此,当我按照您建议的方式进行前向声明时,编译时出现此错误:"error C2371: 'custom::DataType': redefinition; different basic types"
  • @ilim:我错过了道歉 - 编辑了我的答案。你不能真正前向声明typedef
【解决方案2】:

如果DataType 是类类型或具有底层整数类型的枚举,则可以在action.h 中转发声明:

namespace custom {
  class DataType1;

  enum DataType2 : int; 
}

缺点是更新库时它可能会中断。编写良好的库可能有一个除了前向声明之外什么都没有的标题,您可以使用它,因此您可以查找那些(例如:iosfwd)。

否则,将无法包含库编写者提供的标头。

【讨论】:

  • 我最初也这么认为,但不幸的是,正如我在问题中指出的那样,它是由 typedef 定义的。它的定义基于自定义(即库)中使用的其他一些内部数据类型,这些数据类型也在命名空间custum中。
  • @ilim - 恐怕我回答中的最后一句话适用。
猜你喜欢
  • 2015-05-10
  • 1970-01-01
  • 2012-12-27
  • 1970-01-01
  • 2021-11-10
  • 1970-01-01
  • 1970-01-01
  • 2019-09-21
  • 2012-12-15
相关资源
最近更新 更多