3

この疑似コードは、"A Not-So-Good Long-Term Solution" というサブタイトルでGotW #53から入手したものです。特に以下の「//エラー:潜在的...」で始まるコメントに関連して、著者が言っていることをすでに数時間理解しようとしましたが、役に立ちませんでした。これについて何か助けていただければ幸いです。

    //  Example 2c: Bad long-term solution (or, Why to
    //              avoid using declarations in
    //              headers, even not at file scope)
    //
    //--- file x.h ---
    //
    #include "y.h"  // declares MyProject::Y and adds
                    //  using declarations/directives
                    //  in namespace MyProject
    #include <deque>
    #include <iosfwd>
    namespace MyProject
    {
      using std::deque;
      using std::ostream;
      // or, "using namespace std;"
      ostream& operator<<( ostream&, const Y& );
      int f( const deque<int>& );
    }
    //--- file x.cpp ---
    //
    #include "x.h"
    #include "z.h"  // declares MyProject::Z and adds
                    //  using declarations/directives
                    //  in namespace MyProject
      // error: potential future name ambiguities in
      //        z.h's declarations, depending on what
      //        using declarations exist in headers
      //        that happen to be #included before z.h
      //        in any given module (in this case,
      //        x.h or y.h may cause potential changes
      //        in meaning)
    #include <ostream>
    namespace MyProject
    {
      ostream& operator<<( ostream& o, const Y& y )
      {
        // ... uses Z in the implementation ...
        return o;
      }
      int f( const deque<int>& d )
      {
        // ...
      }
    }
4

2 に答える 2

1

彼はusing、ヘッダーファイルでディレクティブを使用しないように言っています。例: xh と zh という 2 つのファイルがあり、これらの宣言が含まれているとします。

// x.h
namespace MyProject
{
  using std::deque;
  using std::ostream;
  ....
};

// z.h
namespace MyProject
{
  using mystd::deque;
  using mystd::ostream;
  ....
};

問題は、あなたの例でどの ostream オブジェクトが呼び出されるかということです。

// x.cpp
#include "x.h"
#include "z.h"
#include <ostream>
namespace MyProject
{
  ostream& operator<<( ostream& o, const Y& y )
  {
    // ... uses Z in the implementation ...
    return o;
  }
  int f( const deque<int>& d )
  {
    // ...
  }
}

定義を呼び出したいのですがx.h、インクルードの順序により、z.hインクルード定義が呼び出されます

于 2013-07-09T19:22:31.633 に答える