40

複数の依存モジュールを含むライブラリを作成しています。別のモジュールからファイルをインクルードする場合、名前空間を次のように解決する必要があります。

using namespace project1::namespace1;
class1 obj;

また

typedef project1::namespace1::class1 class1;
class1 obj;

各アプローチの長所と短所は何ですか? typedef.H ファイルと.C ファイルで使用する必要がある場所を読みusingましたが、これは賢明ですか?

「typedef」で発生した問題の 1 つは、元のクラスと「typedef」を含むクラスの両方を 3 番目のモジュールに含めると、名前空間が曖昧になることです。

4

4 に答える 4

76

あなたが述べた2つのオプションは同等ではありません。これです:

using namespace project1::namespace1;

名前空間からすべてを取得するため、ほとんど制御できず、衝突が発生しやすくなります。ここには短所しかなく、長所はありません。

typedefただし、単一のシンボルを取り込むために aを使用する必要はありません。

using project1::namespace1::class1;

これを使用するか、を使用するかは、typedefそれほど大きな違いはありません。ただし、値、関数などを参照できるtypedefのに対し、型と列挙に限定されることに注意してください。using

namespace X {
  const int x{42};
  enum Fruit{Apple, Pear};
}

using X::x; // OK
typedef X::x xx; // Error! 'x' in namespace 'X' does not name a type

したがって、2 つの式は完全に同等ではありません。

于 2012-04-26T10:29:48.897 に答える
8

名前を入力しやすくするためだけに、ヘッダー ファイルでusingorを使用しないでください。typedef

ソースファイルでは、それはあなた次第です。名前全体を書き出すことをお勧めします。これにより、意味が非常に明確になります。名前空間が長すぎる場合は、名前空間エイリアスを使用して混乱を減らすことができますが、それでも意味を明確に保ちます。namespace ns = project1::namespace1;

いずれにせよ、シンボルをグローバル名前空間にインポートする場合はusing、 ではなくを使用してくださいtypedeftypedefは主に、型を別の名前で呼び出したい場合に使用されます。これは、テンプレートであるためです。たとえば、 のmy_map代わりに使用std::map<std::string, my_type>します。

また、次の質問も参照してください

于 2012-04-26T10:40:01.800 に答える
6

最も明確な方法は、これらのメソッドを使用しないことnew project1::namespace1::class1()です。

于 2012-04-26T10:28:31.840 に答える
3

use using project1::namespace1::class1

Or, you can limit your using namespce in a local scope, both for your convenience and not polute the global namespace.

void function()
{
    using namespace project1::namespace1;

    class1 obj;

    ...
}
于 2012-04-26T10:37:13.303 に答える