【发布时间】:2012-12-23 12:48:06
【问题描述】:
我原来的类结构类似于:
//def.h
namespace A
{
struct X {};
}
并在需要时转发声明:
//file that needs forward declarations
namespace A { struct X; }
经过一些重构,X 被移动到不同的命名空间,但为了保持旧代码“正常工作”,使用了using 指令:
//def.h
namespace B
{
struct X {};
}
namespace A
{
using ::B::X;
}
现在我们可以访问保持旧语法A::X 的同一个类,但是前向声明会导致错误。第二个问题是我收到的错误消息没有指向前向声明的位置,并且查找/替换前向声明非常耗时。
现在我解决了这个问题(困难的方式)。
处理这种情况的最佳方法是什么?
IMO,using 根本不应该存在,所有使用 X 的代码都应该重构以适应新的命名空间(这是一种解决方案),但不幸的是,这不是一个选项。
实际代码要复杂很多,这是一个简化的例子。
【问题讨论】:
-
我猜
fwd.h不是def_fwd.h,也就是说,一个头文件的全部意图是转发声明一些其他的头文件名称? -
@K-ballo 这只是一个名称,前向声明是每个实现文件。
-
嗯,这放弃了我处理这个问题的建议。取自 Standard Library(参见
iosfwd)、Boost(到处都是)等。人。 -
X是否已移至现有命名空间B或namespace A已重命名为B?在后一种情况下,您可以使用命名空间别名吗? -
@rhalbersma 现有命名空间 -
A仍然存在。
标签: c++ namespaces refactoring forward-declaration using-directives