0

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 然后访问该类成员的 1,x1。

这两个文件在 Fedora 14 中使用 gcc 5.4.1 编译成功。运行输出为:

pre 2
post 2

我期望“发布 100”,因为我想在全球范围内访问 A 类中的 int x1。

4

2 回答 2

3

extern, s 或前向声明似乎都不namespace是您认为的意思。

如果您想引入一个可以访问我的多个翻译单元的名称(当您说“全局”时,您的意思似乎是),您可以将这些定义放在一个头文件中,并将#include该头文件放在您想使用的任何地方。

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

于 2012-06-18T21:56:51.130 回答
1

我只是要帮助您解决问题,而您绝对必须注意有关 ODR(一个定义规则)的其他答案并修复您的设计。

ns.cpp文件中,您必须将该行ns::A a;移出main()函数。将其放在文件范围内(例如,就在 . 之前main。)此外,在ns_call.cpp文件中,也将行extern ns::A a;移出函数。

注意:你可能需要也可能不需要做第二部分,整个方法可能会也可能不会。我现在无法访问编译器。

我不得不再次同意其他评论,即这种设计有缺陷,它会让你头疼。

于 2012-06-18T22:30:48.227 回答