На странице 172 Страуструп делает что-то вроде этого:
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" (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
) приведет к перестройке драйвера / main.cpp - без необходимости?
174.png