向前删除标题文件中其他名称空间的自定义类型
Forward-declaring a custom type of another namespace in a header file
我正在使用一个名为 custom (不是实际名称(的外部库,该库在其自己的名称空间中定义了许多数据类型。假设名称空间也被称为custom
。
我正在尝试使用名为DataType
的数据类型。DataType
是使用Typedef定义的自定义类型,让我们假设可以通过包括"custom/datatype.h"
我的代码具有以下设置。
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.h
和some_action.h
中有什么适当的方法可以转发Declare DataType
?
除了在
action.h
中包括"custom/datatype.h"
以外,是否有适当的方法来定义DataType
和some_action.h
?
您可能不想"定义" DataType
,而是"向前声明" 它。这使您可以使编译器意识到custom::DataType
,该CC_16将在以后定义。
您可以如下实现这一目标。在action.h
和some_action.h
中,添加以下正向声明:
namespace custom { class DataType; }
在.cpp
文件中需要DataType
的定义,包括"custom/datatype.h"
。
custom::DataType
是A type别名(即typedef
(,您需要包括标头。没有一种转发类型的别名的方法:请参阅此问题&相关信息的答案。
如果DataType
是具有基础整数类型的类类型或枚举,则可以在action.h
中转发它:
namespace custom {
class DataType1;
enum DataType2 : int;
}
不利的一面是,当您更新库时,它可能会破裂。书写良好的库可能包含一个包含的标题,除了您可能会使用的远期声明,因此您可以查找这些标题(示例:iosfwd
(。
否则,没有包含您由图书馆作者给出的标头的追索权。
- C++映射:具有自定义类的运算符[]不起作用(总是返回0)
- 在命名空间中定义函数还是限定函数
- 自定义提升前缀/命名空间 - 如何使用
- Boost ODEINT:具有自定义类和向量空间代数的受控步进器
- 与自定义命名空间一起使用时实现 std::error_category、名称解析问题
- 向前删除标题文件中其他名称空间的自定义类型
- 更改命名空间以自定义 Boost XML 的标记名称后的反序列化问题
- 自定义点 - 命名空间注入
- 如何让非成员在<N>命名空间中为自定义类工作 [C++17]
- 自定义容器在保留空间时不必要地创建新元素实例
- 将 boost odeint 与 std::map 和自定义向量空间代数一起使用时,没有可行的重载'='
- C++在boost python中使用带有命名空间的自定义智能指针
- 在自定义命名空间下包含一个标头
- 与自定义命名空间的链接失败未解析的外部符号
- 自定义折叠模板参数空间
- 在命名空间中使用带有自定义运算符<<的 boost::lexical_cast
- 命名空间中变量的默认/自定义值
- 自定义命名空间的链接器错误
- 用SWIG包装仅在头文件中定义的命名空间自定义类型
- 具有自定义返回类型的全局命名空间中的友元函数