В чем разница между этими двумя использованиями ключевого слова using:
using boost::shared_ptr;
и
using namespace boost;
В чем разница между этими двумя использованиями ключевого слова using:
using boost::shared_ptr;
и
using namespace boost;
using boost::shared_ptr;
Включает только shared_ptr из пространства имен boost в вашем текущем пространстве имен.
Это означает, что вы можете использовать shared_ptr, не отделяя его от пространства имен boost.
Он называется с использованием объявления.
using namespace boost;
Включает все символы в пространстве имен boost в вашей текущей области.
Это означает, что вы можете использовать все символы в пространстве имен boost, не присваивая им пространство имен boost.
Он называется с использованием директивы.
Почему вы всегда предпочитаете using declaration над using directive?
Всегда лучше использовать первую (using declaration) и избегать второй (using directive), потому что вторая вызывает загрязнение пространства имен, внося потенциально огромное количество имен в текущую пространство имен, многие из которых не нужны. Наличие ненужных имен значительно увеличивает вероятность непредвиденных конфликтов имен.
Процитировать Herb Sutter по использованию using directive:
Я считаю полезным думать о using directive как о мародерстве армии сумасшедших варваров, которые сеют беспорядочное разрушение, где бы оно ни проходило, - то, что своим простым присутствием может вызвать unintended conflicts,, даже когда вы думаете, reiedied with it.
using namespace boost делает все имена в пространстве имен boost видимыми без квалификацииusing boost::shared_ptr просто делает shared_ptr видимым без квалификации.Первый называется using declaration;
Вторая называется using directive.
Цитата MSDN:
Обратите внимание на разницу между директивой using и использованием Объявление:
использование объявления позволяет указать индивидуальное имя используется без квалификации,
директива using позволяет всем именам в пространстве имен, которое будет использоваться без квалификации.
Первый позволяет использовать имя shared_ptr без префикса boost::. Второй позволяет использовать любые и все имена в пространстве имен boost с префиксом boost::. Некоторые люди нахмурились, но это никогда не давало мне никаких проблем.