Подтвердить что ты не робот

Можно ли отменить эффект "использования пространства имен" в С++?

С using namespace я делаю все содержимое этого пространства имен видимым напрямую, не используя квалификатор пространства имен. Это может вызвать проблемы, если using namespace встречается в широко используемых заголовках - мы можем непреднамеренно сделать два пространства имен с идентичными именами классов видимыми, и компилятор откажется компилировать, если только имя класса не добавлено с квалификатором пространства имен.

Можно ли отменить using namespace, чтобы компилятор забыл, что он видел это раньше?

4b9b3361

Ответ 1

Нет, но вы можете сообщить своим коллегам, что в заголовке никогда не должно быть директивы или объявления using.

Ответ 2

Как говорили другие, вы не можете, и проблема не должна быть в первую очередь.
Следующее лучшее, что вы можете сделать, это ввести нужные символы, чтобы они были предпочтительнее по имени:

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"
}

Ответ 3

Нет, С++ 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.

Ответ 4

Насколько мне известно... Но, как правило, я использую только "использование пространства имен" в файлах .cpp.

Ответ 5

Ближайший, который я попытаюсь использовать в файлах заголовков, следующий:

//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 для каждого имени из соответствующего пространства имен