在另一个命名空间内定义静态类成员

Defining a static class member inside of another namespace

本文关键字:静态类 成员 定义 另一个 命名空间      更新时间:2023-10-16

如果我在命名空间中有一个具有私有静态成员的类:

namespace A {
class T {
    public: 
        //functions
    private:
        static bool a;
        static unsigned int b;

我正在另一个文件中对这个类进行单元测试,例如:

namespace {
bool A::T::a = false;
unsigned int A::T::b = 1;
/* tests declaring an instance of A...*/

我收到Clang:的错误

error: cannot define or redeclare 'a' here because namespace '' does not enclose namespace 'T'error: cannot define or redeclare 'b' here because namespace '' does not enclose namespace 'T'

我已经查看了关于静态私有成员的其他答案,以及在类的声明所在地声明它们的必要性,我相信我在这里就是这么做的,但我仍然没有注意到这个错误。

我已经研究了关于静态私人成员的其他答案,以及在类的声明所在地声明它们的必要性,这就是我相信我在这里所做的,

不,你没有那样做。如果声明在"foo.h"中,那么定义应该在"foo.cpp"中,而不是在用于单元测试的文件中。

但我还是忘了这个错误。

namespace {

定义了一个与全局范围不同的匿名namespace。在匿名namespace中声明的名称仅在翻译单元中可见。匿名namespace中定义的任何内容也必须在该namespace中声明。

您可以使用:

bool A::T::a = false;
unsigned int A::T::b = 1;

更好的是,使用:

namespace A {
    bool T::a = false;
    unsigned int T::b = 1;

并将这些代码行放在与.h文件相对应的.cpp文件中,而不是放在单元测试文件中。