gpt4 book ai didi

带有类的 C++ 命名空间

转载 作者:行者123 更新时间:2023-11-27 23:23:35 25 4
gpt4 key购买 nike

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。

这 2 个文件在 Fedora 14 中使用 gcc 5.4.1 编译正常。运行输出为:

pre 2
post 2

我期望'post 100'因为我想访问A类中的int x1全局。

最佳答案

externnamespace 或前向声明似乎都不是您认为的意思。

如果你想引入一个可以访问我的多个翻译单元的名称(当你说“全局”时你似乎是什么意思),你把这些定义放在头文件中,然后 #include 无论您想在何处使用该 header 。

您实际上在做的是在每个翻译单元(例如,在每个 CPP 文件中)一遍又一遍地引入 class A。这充其量也违反了 ODR。

关于带有类的 C++ 命名空间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11091567/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com