Мне кажется, что использование незанятых пространств имен просто вызывает проблемы позже, когда кто-то вставляет новое пространство имен, которое, как оказалось, имеет то же имя, что и пространство имен корневого уровня, и таинственным образом изменяет значение целого ряда программ. Итак, почему люди всегда говорят std::
вместо ::std::
. Действительно ли они хотят сказать: «Я хочу использовать все, что подойдет std
, а не корневое»??
Вот пример того, что я имею в виду:
В fred / Foo.h:
#include <string>
namespace fred {
class Foo {
public:
void aPublicMember(const std::string &s);
};
} // end namespace fred
В Fred / Bar.h:
namespace fred {
namespace std { // A standard fred component
class string { // Something rather unlike the ::std::string
// ...
};
} // namespace std
class Bar {
public:
void aPublicMember(std::string &s);
};
} // namespace fred
В oops.cpp:
#include <string>
#include "fred/Bar.h"
#include "fred/Foo.h" // Oops, the meaning of Foo is now different.
Это то, чего хотят люди, или я что-то упускаю?
А может быть, вы говорите, что никогда не должны называть пространство имен std
. И это все хорошо, но что тогда с другим пространством имен корневого уровня? Должно ли какое-либо пространство имен корневого уровня, которое кто-либо когда-либо определил где-либо, всегда быть запрещенным для имени подпространства имен?
Чтобы уточнить, я не буду рассматривать любой ответ, который говорит мне, что std
особенный, потому что я просто использовал его в качестве примера. Я говорю об общей проблеме, и я использую std
в качестве опоры, чтобы проиллюстрировать ее, хотя признаю, что это довольно поразительная опора.