【问题标题】:How can I forward declare an array inside a namespace in c++如何在 C++ 中的命名空间内转发声明数组
【发布时间】:2021-02-12 08:54:53
【问题描述】:

我一直在尝试找出如何正确使用命名空间。我想使用命名空间,但不必在头文件中定义它。我不确定如何使用命名空间内的数组来做到这一点。我要么收到“已经定义的符号”错误,要么被告知命名空间尚未声明。

我试过这样写代码:

//Header.h

namespace foo {
    int array[5];
}
//Source.cpp

#include "Header.h"

namespace foo {
    int array[5] = {0, 1, 2, 3, 4, 5};
}

它返回一个错误。

如果我尝试前向声明命名空间,就像我对任何其他变量一样,它表示命名空间未定义,所以我不确定实现此目的的正确方法是什么。

//Header.h

extern int foo::array;
//Source.cpp

#include "Header.h"

namespace foo {
    
    int array[5] = {0, 1, 2, 3, 4, 5};

}

【问题讨论】:

  • 有道理,在头文件中声明和定义命名空间是最佳实践吗?或者我应该避免在这种情况下使用命名空间

标签: c++ namespaces declaration definition name-lookup


【解决方案1】:

与全局命名空间相同:

// .h
namespace foo {
    extern int array[5];
}
// .cpp
namespace foo {
    int array[5] = {1, 2, 3, 4, 5};
}

【讨论】:

  • 谢谢!我觉得自己像个菜鸟
  • .cpp 文件中,您可以选择使用int foo::array[5] = {1, 2, 3, 4, 5}; 而不使用另一个namespace {} 块。但是,如果您在同一个命名空间中定义了其他内容,则使用该块是有意义的。
【解决方案2】:

这个

namespace foo {

    int array[5];

}

是数组的定义。

另一方面,这个声明

extern int foo::array;

存在于全局命名空间而不是命名空间foo。那就是命名空间 foo 尚未声明,您不能使用限定名称 foo::array

要在标头中声明数组,请使用存储说明符extern

namespace foo {

    extern int array[5];

}

然后在cpp文件中你可以写例如

int foo::array[5] = {0, 1, 2, 3, 4, 5};

【讨论】:

  • 哦,哇,有道理。我很生气我没有想到这一点。谢谢!
猜你喜欢
  • 2011-03-17
  • 1970-01-01
  • 2013-09-30
  • 2011-04-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-10-27
相关资源
最近更新 更多