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

时间:2016-07-28 20:02:14

标签: c++ static namespaces

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

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'

我已经查看了有关静态私有成员的其他答案以及需要在类声明的地方声明它们,这是我相信我在这里做的,但错误仍然让我感到厌烦。

1 个答案:

答案 0 :(得分:1)

  

我已经查看了有关静态私有成员的其他答案以及需要在类声明的地方声明它们,这是我相信我在这里所做的,

不,你不是那样做的。如果声明在“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文件中,而不是单元测试文件中。