문제

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에서 포함되어 있음을 의미합니다. 두 번째 네임 스페이스는 구현 자의 Spere.cpp에서 포함되어 있습니까? 그 이유는 그가 말한다 :

"컴파일러는 일관성을 확인하기에 충분한 정보가 없습니다. 네임 스페이스의 두 가지 정의 "

  • 구현 자 및 user.h가 모두 "파서 구현"(parse.cpp)에 포함될 수 없으므로

    172.png 173.png 174 페이지, 그는 다음과 같습니다 :

      namespace Parser {   //interface for implementers
        // ...
        double expr(bool);
       // ...
      }
    
      namespace Parser_interface { //interface for users
        using Parser::expr;
      }
    
    .

    는 상위 네임 스페이스가 구현 자로 가고 User.h로 낮은

    "dependency graph"는 분명히 실행되면 "Parser"(parser.cpp/implementer.h)로 변경하면 드라이버 / main.cpp가 재구성됩니다. 불필요하게?

    174.png

도움이 되었습니까?

해결책

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

(컴파일러 일관성에 대한 부분이 잘못되고 위의 스레드는 왜 다음과 같이 구성됩니다. 예, 구현은 그렇게 할 수 있지만 확인해야합니다. 일관성은 어느 정도까지만 작동합니다.user.h가있는 것들을 사용하는 경우 거기서 선언되지 않아 진단을 받게됩니다.당신이 "더블 expr (bool); "한 곳에서 선언되고"float expr (bool) "; 컴파일러는 또한 진단을 제공해야합니다.그러나, 당신이 그를 바꾸면 두 번째 사람은 "float expr (int)", 이는 단지 과부하 일뿐입니다. 완벽하게 법적 C ++.- Ulrich Eckhardt)

다른 팁

세 가지 질문 모두 "예"에 대한 답변이 믿습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top