pg:172-176.PartA.La Conception de l'Interface Alternatives, Stroustrup-CPL-3E
-
09-12-2019 - |
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)?
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?
La solution
(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"