20

ヘッダー ファイル内に宣言を入れると問題が発生する可能性があることは理解しているusingので、そうしたくありません。代わりに、using(または a namespace foo =) をクラス宣言内に配置して、ヘッダー ファイル内での繰り返し入力を削減しようとしました。残念ながら、コンパイル エラーが発生します。便利な機能になりそうです。

#ifndef FOO_H
#define FOO_H

// This include defines types in namespace gee::whiz::abc::def,
// such as the class Hello.
#include "file_from_another_namespace.h"

// using namespace gee::whiz::abc::def; // BAD!

namespace x {
   namespace y {
      namespace z {

struct Foo {
    using namespace gee::whiz::abc::def; // Illegal.
    namespace other = gee::whiz::abc::def; // Illegal.

    // Foo(gee::whiz::abc::def::Hello &hello); // annoyingly long-winded

    Foo(other::Hello &hello); // better
    //...
};

} } } // end x::y::z namespace

#endif // FOO_H

実際のコードでは、名前空間名はずっと長くて煩わしく、私が変更できるものではありません。

これが合法ではない理由、または(より良い)回避策があるかどうかを誰かが説明できますか?

4

3 に答える 3

26

できますかtypedef gee::whiz::abc::def::Hello Hello

于 2010-01-25T19:13:21.457 に答える
4

実際にはまったく恐ろしい考えではありません。それは、少なくとも現在の仕組みと同じくらい理にかなっています (当然ですが、あまり意味がありません)。基本的な問題は、クラスがコンパイルとリンクの単位ではなく、「翻訳単位」であることだと思います。しかし、Java や C# などのより理にかなった言語のように、クラスをモジュールにすることで、クラスごとに行う方がはるかにクリーンです。

于 2010-01-25T19:13:16.130 に答える
1

同じ問題があり、この質問が見つかりました。struct foo を匿名の名前空間でラップすると、

名前空間も使用::多くの::名前;

匿名ラッパーの上部にあります。ただし、ネストされたブレースのレイヤーをさらに追加するのはちょっと見苦しいです。

于 2010-12-02T12:37:42.273 に答える