0

誰かが出力の下に説明してもらえますか:

#include <iostream>

using namespace std;

namespace A{
    int x=1;
    int z=2;
    }

namespace B{
    int y=3;
    int z=4;
    }

void doSomethingWith(int i) throw()
{
    cout << i ;
    }

void sample() throw()
{
    using namespace A;
    using namespace B;
    doSomethingWith(x);
    doSomethingWith(y);
    doSomethingWith(z);

    }

int main ()
{
sample();
return 0;
}

出力:

$ g++ -Wall TestCPP.cpp -o TestCPP
TestCPP.cpp: In function `void sample()':
TestCPP.cpp:26: error: `z' undeclared (first use this function)
TestCPP.cpp:26: error: (Each undeclared identifier is reported only once for each function it appears in.)
4

3 に答える 3

4

別のエラーがあります:

エラー: 'z' への参照があいまいです

これは私には明らかです。z両方の名前空間に存在し、コンパイラはどちらを使用すべきかわかりません。あなたは知っていますか?名前空間を指定して解決します。次に例を示します。

doSomethingWith(A::z);
于 2013-06-26T16:50:42.407 に答える
4

usingキーワードは

  1. 名前をショートカットして、次のようなものを入力する必要がないようにしますstd::cout

  2. テンプレート(c ++ 11)でtypedefに、つまりtemplate<typename T> using VT = std::vector<T>;

あなたの状況でnamespaceは、名前の汚染を防ぐために使用されます。これは、2 つの関数/変数が誤って同じ名前を共有していることを意味します。2 つを一緒に使用するusingと、あいまいになりzます。私のg ++​​ 4.8.1はエラーを報告しました:

abc.cpp: In function ‘void sample()’:
abc.cpp:26:21: error: reference to ‘z’ is ambiguous
     doSomethingWith(z);
                     ^
abc.cpp:12:5: note: candidates are: int B::z
 int z=4;
     ^
abc.cpp:7:5: note:                 int A::z
 int z=2;
     ^

これは期待されています。どの gnu コンパイラを使用しているかはわかりませんが、これは予測可能なエラーです。

于 2013-06-26T16:53:54.230 に答える
2

次善のメッセージが表示されます。より良い実装でもエラーのフラグが立てられますが、「未宣言」ではなく問題であるため、「z があいまいです」と言います。

z という名前の時点で、A::z と B::z という複数のものにヒットします。ルールは、実装がそれらの 1 つだけを選択してはならないということです。問題を解決するには、資格を使用する必要があります。

于 2013-06-26T16:51:10.973 に答える