【问题标题】:Defining a static class member inside of another namespace在另一个命名空间内定义一个静态类成员
【发布时间】:2016-07-28 20:02:14
【问题描述】:

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

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'

我已经查看了有关静态私有成员的其他答案以及需要在类的声明所在的位置声明它们,这就是我相信我在这里所做的,但错误仍然让我无法理解。

【问题讨论】:

  • namespace { 是匿名的。声明的定义是在namespace A 中提出的,不能在那里完成,句号。

标签: c++ static namespaces


【解决方案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文件中,而不是单元测试文件中。

【讨论】:

    猜你喜欢
    • 2012-03-13
    • 1970-01-01
    • 2017-08-09
    • 2010-10-12
    • 2012-05-27
    • 1970-01-01
    • 2013-03-10
    • 2012-05-27
    • 2021-01-01
    相关资源
    最近更新 更多