3

这个伪代码是从GotW #53获得的,标题是“A Not-So-Good Long-Term Solution”。几个小时以来,我一直在试图理解作者在说什么,特别是与下面以“//错误:潜在......”开头的评论有关,但无济于事。我真的很感激这方面的一些帮助。

    //  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在头文件中使用该指令。例如:假设我们有 2 个带有这些声明的文件 xh 和 zh:

// 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 回答
0

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

于 2013-07-09T19:15:56.950 回答