Question

À la page 172, Stroustrup est en train de faire quelque chose comme ça:

  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>
  }

T1. est ce que cela implique que le premier espace de noms est insérée dans (par exemple) de l'utilisateur.h et inclus à partir de main.cpp - le conducteur;le deuxième espace de noms en oeuvre.h et inclus à partir de parse.cpp?Est-ce pour cette raison qu'il dit:

"compilateur ne dispose pas de suffisamment d'informations pour vérifier la cohérence les deux définitions de l'espace de noms"

  • parce que à la fois opérateur.h et l'utilisateur.h ne peut pas être inclus dans un "Analyseur de mise en œuvre"(parse.cpp)?

172.png 173.png

Sur la page 174, il a:

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

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

Est en haut de l'espace de noms d'aller en oeuvre.h et inférieur à l'utilisateur.h

Dans son "dependency graph"est-il retraitement de l'évidence:que Faire quand est exécuté, tout changement de "Parser"(parser.cpp/implementer.h) entraînera driver/main.cpp en cours de reconstruction - inutilement?

174.png

Était-ce utile?

La solution

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

(la partie sur la cohérence du compilateur est fausse et le fil ci-dessus indique pourquoi: Oui, la mise en œuvre peut et devrait faire cela, mais la vérification de La cohérence ne fonctionne que dans une certaine mesure.Si utilisateur.h utilise des choses qui sont Non déclaré là-bas, vous obtiendrez un diagnostic.Si vous avez "double Expr (Bool); "déclaré au même endroit et" float expr (bool); "dans un autre, le Le compilateur devrait également vous donner un diagnostic.Cependant, si vous changez le deuxième à "float expr (int);", alors ceci est juste une surcharge qui est Parfaitement légal C ++.- Ulrich eckhardt)

Autres conseils

Je crois que les réponses à toutes les trois questions sont "oui"

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top