带有类的 C++ 命名空间
c++ namespace with class
ns.cpp
:
#include <iostream>
namespace ns { // want to access this globally
class A ;
}
class ns::A {
public:
int x1;
char s1[128];
};
int main()
{
int doit();
//using namespace ns;
ns::A a;
a.x1= 2;
std::cout << "pre " << a.x1 << "n" ;
doit();
std::cout << "post " << a.x1 << "n" ;
}
ns_call.cpp
:
namespace ns {
class A;
}
class ns::A {
public:
int x1;
char s1[];
};
using namespace ns;
int
doit()
{
extern ns::A a;
a.x1= 100;
}
在 NS.cpp 中,类是在命名空间中声明的。类定义后跟。
类中的变量将全局访问。这是命名空间的目标。
然后ns_call.cpp访问类成员 x1 的 1
。这 2 个文件在 Fedora 14 中使用 gcc 5.4.1 编译正常。运行输出为:
pre 2
post 2
我期望"后 100",因为我想在 A 类中访问 int x1全球。
extern
、namespace
s 或前向声明似乎都没有你认为它们的意思。
如果你想引入一个可以访问我的多个翻译单元的名称(当你说"全局"时,你的意思似乎是),你把这些定义放在一个头文件中,并从你想使用它的地方#include
那个头。
您实际上正在做的是在每个翻译单元(例如,在每个CPP文件中)一遍又一遍地引入class A
。 这充其量是违反 ODR。
我只是要帮助你解决问题,而你绝对必须注意关于ODR(一个定义规则)的其他答案并修复你的设计。
在ns.cpp
文件中,您必须将行ns::A a;
移出main()
函数。将其放在文件范围内(例如,在main
之前)。此外,在ns_call.cpp
文件中,将行extern ns::A a;
也移出函数。
注意:您可能必须也可能不必执行第二部分,并且整个方法可能有效,也可能无效。我现在无法访问编译器。
再次,我必须同意其他评论,即这种设计存在缺陷,会让您头疼。
相关文章:
- 命名空间中具有.h和.cpp文件的类
- 从父命名空间重载类型
- 在命名空间中定义函数还是限定函数
- C++:对不存在的命名空间使用命名空间指令
- 通过继承类使用来自不同命名空间的运算符
- 使用命名空间时出现多个定义错误
- CUDA内核和数学函数的显式命名空间
- 嵌套的匿名命名空间
- CMakeLists.txt中的命名空间表示法
- 类是C++中的命名空间吗
- 在命名空间中使用全局命名空间中的函数
- 如何使 std::sort 在 std::swap 和我的命名空间的模板化交换之间没有名称冲突?
- '使用命名空间{嵌套在另一个命名空间中的某个命名空间}"
- 是否可以将函数导入命名空间,但不能导出它?
- C++ C++类中的命名空间降级
- 如何使用 soong 命名空间来有条件地编译模块
- 使用 Clang++ 有没有办法将文件作为命名空间等包含?
- 使用 make 编译 MPI,几个命名空间错误,例如"错误:未知类型名称'使用'?
- 如何通过命名空间调用非静态方法
- 在命名空间名称之前加上 :: 是什么意思?