2016-05-27 5 views
1

Предположим, у меня есть следующий кодПредпочитают один из нескольких деклараций с таким же именем

namespace A { 
    int foo(); 
} 
namespace B { 
    void foo(); 
} 
using namespace A; 
using namespace B; 


int x = foo(); // error 

и я нахожу A::foo действительно полезным, но я не то, что в B::foo. Есть ли что-нибудь, что я могу сделать, чтобы сделать A::foo предпочтительнее после последующих безоговорочных ссылок на foo? Например. using A::foo (что на самом деле не имеет эффекта), или unusing B::foo.

+0

У вас есть пространство имен A и B, и вы хотите предпочесть A :: foo, тогда вам нужно удалить оба оператора 'using namespace', а затем в функцию, где вы хотите предпочесть A :: foo use' using A :: foo', а затем вызов 'foo()' приведет к функции foo из A – Deepanshu

+0

. Это не очень хороший ответ. См. ответ SergeyA ниже - так что это комментарий. Вы можете (и должны) явно указать пространство имен: 'int x = A :: foo();' Это полностью исключает необходимость использования пространства имен. – user4581301

ответ

2

Весь смысл иметь пространство имен - это изолировать имена. К using всему пространству имен вы бросаете вызов именно этой причине.

Решение вашей проблемы состоит в том, чтобы остановить using namespace раз и навсегда и никогда не возвращаться к этой прискорбной тактике.

+0

Или делать это в ограниченных областях, т. Е. 'Int main() {с использованием пространства имен A; ...} ' –

+0

@sleeptightpupper, я еще не вижу причин использовать все пространство имен даже в достаточно узкой области. – SergeyA

+0

Но делайте это разумно в ограниченных областях. 'int main() {с использованием пространства имен A; используя пространство имен A; int x = foo(); } 'оставляет OP не лучше. Пока вы не знаете, что делаете, и можете оправдать использование пространства имен ', не делайте этого. – user4581301

 Смежные вопросы

  • Нет связанных вопросов^_^