Domanda

A pagina 172, Stroustrup sta facendo qualcosa del genere:

  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. Si implica che il primo spazio dei nomi viene inserito in (ad esempio) user.h e incluso da main.cpp - il conducente; il secondo spazio dei nomi in implementer.h e incluso da Parse.cpp? È per questo che dice:

.

"Il compilatore non ha informazioni sufficienti per verificare la coerenza delle due definizioni dello spazio dei nomi "

    .
  • perché entrambi gli implementer.h e user.h non possono essere inclusi in "implementazione parser" (parse.cpp)?

    172.png 173.png A pagina 174, ha:

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

    Lo spazio dei nomi superiore che entra in implementer.h e più basso in user.h

    Nel suo "dependency graph" sta rifornendo l'ovvio: che quando la marca è eseguita, qualsiasi modifica a "parser" (parser.cpp/implementer.h) comporterà il driver / main.cpp è ricostruito - inutilmente?

    174.png

È stato utile?

Soluzione

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

(la parte sulla coerenza del compilatore è sbagliata e il thread di cui sopra indica il motivo per cui: Sì, l'implementazione può e dovrebbe farlo, ma il controllo di La coerenza funziona solo in una certa misura.Se user.h usa cose che sono Non dichiarato lì, otterrai una diagnostica.Se hai "doppio expr (bool); "dichiarato in un unico posto e" float expr (bool); "in un altro, il Il compilatore dovrebbe anche darti una diagnostica.Tuttavia, se cambi il secondo a "float expr (int);", allora questo è solo un sovraccarico che è C ++ perfettamente legale.- Ulrich Eckhardt)

Altri suggerimenti

Credo che le risposte a tutte e tre le tue domande siano "sì"

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top