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 は、クラスのメンバー x1 の 1 つにアクセスします。

2 つのファイルは、Fedora 14 の gcc 5.4.1 で正常にコンパイルされました。実行出力は次のとおりです。

pre 2
post 2

クラスAのint x1にグローバルにアクセスしたかったので、「post 100」を期待していました。

4

2 に答える 2

1

ODR (One Definition Rule) に関する他の回答に注意し、設計を修正する必要がありますが、私は問題の修正をお手伝いします。

ファイルでは、その行を関数の外ns.cppに移動する必要があります。ファイル スコープに配置します (例: の直前)。また、ファイル内で、その行も関数の外に移動します。ns::A a;main()mainns_call.cppextern ns::A a;

注: 2 番目の部分を実行する必要がある場合とそうでない場合があり、この方法全体が機能する場合と機能しない場合があります。現在、コンパイラにアクセスできません。

繰り返しますが、この設計には欠陥があり、頭痛の種になるという他のコメントに同意する必要があります.

于 2012-06-18T22:30:48.227 に答える