作者试图在GotW#53中说什么?

时间:2013-07-09 19:12:18

标签: c++ header-files using-declaration gotw

此伪代码是在{A 3-Not-Good-Good Long-Term Solution'的副标题下从GotW #53获得的。我一直试图理解作者所说的几个小时,特别是关于以下面的“// error:potential ......”开头的评论,但无济于事。我真的很感激一些帮助。

    //  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 )
      {
        // ...
      }
    }

2 个答案:

答案 0 :(得分:1)

他说不在头文件中使用using指令。例如:假设我们有两个文件x.h和z.h及其声明:

// 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包含定义

答案 1 :(得分:0)

作者说这个代码的问题在于,由于此代码在其他应用程序中使用,因此可能存在多个具有相同名称的内容(“潜在的未来命名空间歧义”),具体取决于在其他应用程序中使用的命名空间头文件。如果他们说应该使用不同的命名空间,则相同的名称可能不会指向作者最初的意图。