C++中的命名空间重构

Namespace refactoring in C++

本文关键字:重构 命名空间 C++      更新时间:2023-10-16

我正在重构大型项目的一小部分命名空间。所以我重构了以下 2 个文件,这些文件Oldname作为要x::y::z的命名空间。

文件1.hpp

namespace x::y::z
{
Class abc
{
public:
void funcA(type1 arg1, type2 arg2)   
}

文件1.cpp

#include "file1.hpp"
namespace x::y::z
{
void abc::funcA(type1 arg1, type2 arg2)
{
--------
}
}

现在我正在解析与上述文件有依赖关系的文件 2。我不想更改此文件的命名空间,而只是修改依赖于上述文件的功能。

文件2.cpp

#include "file1.hpp"
namespace Oldname
{
void abc::funcA(type1 arg1, type2 arg2)
{
mock("txt")
.actualCall("abc.funcA")
.withParameter("arg1", arg1)
.withParameter("arg2", arg2)
}
}

我试图让它如下,

namespace Oldname
{
void x::y::z::abc::funcA(type1 arg1, type2 arg2)
{
mock("txt")
.actualcall("abc.funcA")
.withParameter("arg1",arg1)
.withParameter("arg2",arg2)
}
}

但是,我收到以下错误,

error: cannot define or redeclare 'funcA' here because namespace 'Oldname' does not enclose namespace 'abc'

有人可以帮助如何解决此错误吗?

从 cppreference.com(着重号添加(:

命名空间

外定义和重新声明仅在声明点之后允许,仅在命名空间范围内,并且仅在包含原始命名空间(包括全局命名空间(的命名空间中,并且它们必须使用限定 id 语法

鉴于此规则,允许定义::x::y::z::abc::funcA

  • 在类的定义(::x::y::z::abc(,
  • 在命名空间::x::y::z中,
  • 在命名空间::x::y中,
  • 在命名空间::x中,或
  • 在全局命名空间中。

不允许在任何其他命名空间中使用。特别是,不允许在命名空间Oldname中这样做。要解决此错误(不向file2.cpp引入namespace x(,请将您的定义从Oldname中取出,并将其放在全局命名空间中。或者,也许可以重新考虑命名空间的设置方式。