【问题标题】:pg:172-176.PartA.Interface Design Alternatives, Stroustrup-CPL-3Epg:172-176.PartA.Interface Design Alternatives, Stroustrup-CPL-3E
【发布时间】:2012-03-09 03:28:40
【问题描述】:

在第 172 页,Stroustrup 正在做类似的事情:

  namespace Parser {   //interface for users
    double expr(bool);
  }

  namespace Parser { //interface for implementers
    double prim(bool);
    double term(bool);
    double expr(bool);

    using Lexer::get_token;
    <SNIP>
  }

Q1. 这是否意味着第一个命名空间被插入(例如)user.h 并包含在 main.cpp - 驱动程序中;第二个命名空间进入implementer.h 并包含在parse.cpp 中?这就是他说的原因:

"编译器没有足够的信息来检查一致性 命名空间的两个定义"

  • 因为implementer.h和user.h都不能包含在“Parser implementation”(parse.cpp)中?

172.png 173.png

在第 174 页,他有:

  namespace Parser {   //interface for implementers
    // ...
    double expr(bool);
   // ...
  }

  namespace Parser_interface { //interface for users
    using Parser::expr;
  }

上层命名空间进入implementer.h,下层命名空间进入user.h

在他的“dependency graph”中,他是否重申了显而易见的事实:运行 Make 时,对“Parser”(parser.cpp/implementer.h) 的任何更改都会导致 driver/main.cpp 被重建 - 不必要?

174.png

【问题讨论】:

    标签: c++ namespaces one-definition-rule


    【解决方案1】:

    http://groups.google.com/group/alt.comp.lang.learn.c-c++/browse_thread/thread/3be9f35f2969f311/0d418ec6138a7e58#0d418ec6138a7e58

    (关于编译器一致性的部分是错误的,上面的线程说明了原因: 是的,实施可以而且应该这样做,但是检查 一致性只在一定程度上起作用。如果 user.h 使用的东西是 没有在那里声明,你会得到一个诊断。如果你有“双 expr(bool);”在一个地方声明,“float expr(bool);”在另一个地方声明, 编译器还应该给你一个诊断。但是,如果您更改 第二个到“float expr(int);”,那么这只是一个重载,它是 完全合法的 C++。 ——乌尔里希·埃克哈特)

    【讨论】:

      【解决方案2】:

      我相信你所有三个问题的答案都是“是”

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2016-01-14
        • 2011-10-31
        • 1970-01-01
        • 2012-09-23
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-10-08
        相关资源
        最近更新 更多