Если вы загружаете все элементы из обоих имен в текущей области путем использования using namespace
directove:
using namespace FirstLib;
using namespace SecondLib;
и есть возможность, что некоторые из имен в этих имен могут противоречить друг другу, то вам необходимо сообщить компилятору явно какой из элемента, который вы хотите использовать, в текущей области, путем использования using
декларации:
using SecondLib::Foobar;
в качестве стандарта C++ говорит:
7.3.3 с помощью декларации
1 А с использованием декларирование вводит имени в декларативную область в , которая появляется с помощью декларирования. Это имя является синонимом имени некоторой сущности, объявленной в другом месте.
Эта строка просит компилятор думать SecondLib::Foobar
всякий раз, когда он видит Foobar
для остальной части текущей области видимости, в которой была использована с использованием декларация.
Директива и декларация using
очень полезны, но могут вызывать проблемы, с которыми вы сталкиваетесь. Таким образом, неплохо было бы сузить использование любой формы using
до минимальной возможной области. Вы можете использовать директиву using namespace
в рамках других имен
namespace MyApp {
using namespace ::SecondLib;
}
или даже функции. То же самое относится к декларации using
. Таким образом, это хорошая идея, чтобы сузить сферу применения любого из них:
void foo()
{
::SecondLib::Foobar fb;
}
Это может показаться утомительным, но это только тогда, когда вы печатаете, хотя вы, скорее всего, использование IntelliSense с поддержкой редактора, поэтому стоимость действительно небольшие, но преимущества большие - никаких путаниц, читаемого кода, проблем с компиляцией.
Это также очень хорошая идея НЕ использовать using namespace
в области заголовка. См Header files usage - Best practices - C++
Моего собственного совета: использовать полную квалификацию всякий раз, когда вам нужно использовать любого из этих типов
Не используйте 'с помощью namespace'. Он был изобретен, чтобы защитить вас от вашей самой проблемы, и он отвратителен, потому что он вновь вводит проблему, как и вы.Используйте псевдоним пространства имен, если вы слишком долго набираете его. – GManNickG
Я не очень большой поклонник dos и donts. В школьных книгах случаи применения никогда не бывают черными или белыми. Фактически, решение, которое я предлагаю (использовать декларацию использования), находится в http://www.parashift.com/c++-faq-lite/coding-standards.html#faq-27.5 – gaspard