Ответ 1
Нет, но вы можете сообщить своим коллегам, что в заголовке никогда не должно быть директивы или объявления using
.
С using namespace
я делаю все содержимое этого пространства имен видимым напрямую, не используя квалификатор пространства имен. Это может вызвать проблемы, если using namespace
встречается в широко используемых заголовках - мы можем непреднамеренно сделать два пространства имен с идентичными именами классов видимыми, и компилятор откажется компилировать, если только имя класса не добавлено с квалификатором пространства имен.
Можно ли отменить using namespace
, чтобы компилятор забыл, что он видел это раньше?
Нет, но вы можете сообщить своим коллегам, что в заголовке никогда не должно быть директивы или объявления using
.
Как говорили другие, вы не можете, и проблема не должна быть в первую очередь.
Следующее лучшее, что вы можете сделать, это ввести нужные символы, чтобы они были предпочтительнее по имени:
namespace A { class C {}; }
namespace B { class C {}; }
using namespace A;
using namespace B;
namespace D {
using A::C; // fixes ambiguity
C c;
}
В некоторых случаях вы также можете включить оскорбительное включение в пространство имен:
namespace offender {
# include "offender.h"
}
Нет, С++ Standard ничего не говорит о "отмене". Лучше всего вам разрешено ограничивать область using
:
#include <vector>
namespace Ximpl {
using namespace std;
vector<int> x;
}
vector<int> z; // error. should be std::vector<int>
Но, к сожалению, using namespace Ximpl
также выведет все имена из пространства имен std
.
Насколько мне известно... Но, как правило, я использую только "использование пространства имен" в файлах .cpp.
Ближайший, который я попытаюсь использовать в файлах заголовков, следующий:
//example.h
#ifndef EXAMPLE_H_
#define EXAMPLE_H_
/**
* hating c++ for not having "undo" of using namespace xx
*/
#define string std::string
#define map std::map
class Example {
public:
Example (const char *filename);
Example (string filename);
~Example ();
private:
map<string,complicated_stuff*> my_complicated_map;
};
#undef string
#undef map
#endif //EXAMPLE_H_
в конце концов определяет #undef -able. Есть 2 проблемы: 1. это уродливое 2. используются отдельные #define и #undef для каждого имени из соответствующего пространства имен