1

与えられた:

namespace One {
  void foo(int x) {
    munch(x + 1);
  }
};

namespace Two {
  // ... see later
}

...
void somewhere() {
  using namespace Two;
  foo(42);
  ...

次の2つのバリアントの間に違いはありますか?

a)

namespace Two {
  void foo(int x) {
    munch(x + 1);
  }
};

およびb)

namespace Two {
  using One::foo;
};

編集:(a)コードを複製することはかなり明らかですが、これは決して良い考えではありません。問題は、過負荷の解決などに関するものです。他の名前空間に他fooのsまたはmunchesがある場合はどうなりますか?

4

2 に答える 2

1

aの場合、これらは実際には異なる関数ですが、bの場合、2つの関数は同じです。

assert(&One::foo == &Two::foo);

これはめったに問題になりません。より大きな懸念は、ロジックの複製です。

于 2010-11-06T19:33:03.450 に答える
0

使い方は同等です。コードに関しては、a)関数foo()コードを複製している場合。つまり、どちらのバージョンでもfoo()内部の関数を使用できるようになりますが、a)の場合は、同じ関数であることをコンパイラーが検出するためのヒントがないため、Twoコードが2回生成されます。foo

于 2010-11-06T19:25:29.837 に答える