Заголовочные файлы с такими объявлениями:
void FooBar(System::Network::Win32::Sockets::Handle handle, System::Network::Win32::Sockets::Error& error /*, more fully-qualified param
declarations... */);
распространены в определенных средах.И использование объявлений, которые могли бы смягчить эту проблему, обычно не считается кошерным для использования в заголовочных файлах, поскольку они могут влиять на правила поиска имен для заголовочных файлов, которые будут включены позже.typedefs внутри класса, которые объявлены как private, загромождают пространство имен класса и производное от него пространство имен.
Вот предлагаемое решение:
using {
// A 'using' block is a sort of way to fence names in. The only names
// that escape the confines of a using block are names that are not
// aliases for other things, not even for things that don't have names
// of their own. These are things like the declarations for new
// classes, enums, structs, global functions or global variables.
// New, non-alias names will be treated as if they were declared in
// the scope in which the 'using' block appeared.
using namespace ::std;
using ::mynamespace::mytype_t;
namespace mn = ::mynamespace;
using ::mynamespace::myfunc;
class AClass {
public:
AClass(const string &st, mytype_t me) : st_(st), me_(me) {
myfunc(&me_);
}
private:
const string st_; // string will refer to ::std::string
mn::mytype_t me_;
};
// The effects of all typedefs, using declarations, and namespace
// aliases that were introduced at the level of this block go away
// here. typedefs and using declarations inside of nested classes
// or namespace declarations do not go away.
} // end using.
// Legal because AClass is treated as having been declared in this
// scope.
AClass a("Fred", ::mynamespace::mytype_t(5));
// Not legal, alias mn no longer exists.
AClass b("Fred", mn::mytype_t);
// Not legal, the unqualified name myfunc no longer exists.
AClass c("Fred", myfunc(::mynamespace::mytype_t(5));
В отдельных файлах Java и Pythonобращаются особым образом.Вы можете иметь объявления импорта, которые вводят имена из других пространств имен в файл.Эти имена (ну, не совсем с Python, но это слишком сложно объяснить здесь) будут видны только внутри этого файла.
Я думаю, что C ++ нуждается в аналогичной конструкции.Существование препроцессора, директивы #include
и концепции модуля перевода в C ++ затрудняет неявную область видимости импортированных имен.Поэтому некоторым, я думаю, необходим какой-то механизм для явного определения области действия таких временных псевдонимов.
Какие проблемы вы предвидите с этой идеей?Если проблем нет, или они очень мелкие и их можно исправить, как бы мне было представить их в качестве предложения в комитет по стандартам?