2015-09-16 5 views
0

У меня есть код, приведенный нижеИспользование пространств имен

#include<iostream> 
namespace first{ 
    void test() 
    { 
     std::cout<<"This is the first one \n"; 
    } 
} 
namespace second{ 
    void test() 
    { 
     std::cout<<"This is the second one \n "; 
    } 
} 
int main() 
{ 
    using namespace first; 
    test(); 
    using namespace second; 
    test(); 
    return 0; 
} 

Приведенный выше код дает мне ошибку компиляции вызова перегруженного тестирования функции. Я сомневаюсь, почему второй оператор using using namespace second не скрывает первое пространство имен?

Далее я попытался объявить пространство имен внутри тела функции, это может показаться странным, но я попытался проверить, могу ли я это сделать или нет. Это также привело к ошибке компиляции. Что заставляет меня задаться вопросом, можно ли только объявить пространства имен только в глобальном масштабе?

Мой третий и последний вопрос: есть ли способ, с помощью которого я могу только объявить две функции с одной и той же сигнатурой внутри двух разных пространств имен и определить их вне внешней части пространства пространства имен? Как ниже

#include<iostream> 

namespace first{ 
    void test(); 
} 

namespace second{ 
    void test(); 
} 

int main() 
{ 
    return 0; 
} 

Снова idk ли мой вопрос действителен или нет.

+0

@DevSolar Я редактировал вопрос Теперь –

ответ

1

Я предполагаю, что оба оператора using предшествуют вызову test() (в отличие от одного до и после того, как вы его представили), так как в противном случае код в порядке.

Пространства имен не скрывают друг друга. using namespace first делает идентификаторы (типы, переменные, имена функций и т. Д.) В first становятся кандидатами для сопоставления в следующем коде.

предшествующего вызова test() с

using namespace first; 
using namespace second; 

эффектом является то, что как first::test() и second::test() становятся кандидатами на соответствие последующего неквалифицированное использования test(). У компилятора нет причин предпочитать один над другим - они оба одинаково допустимы, поэтому компилятор отклоняет код из-за двусмысленности, по которой можно выбрать.

Кроме того, test() не загружен в ваш пример. Объявляются и определяются две различные функции в разных пространствах имен. . Их полные имена (как first::test() и second::test() различны

Чтобы ответить на ваш второй вопрос, пространство имена могут быть объявлены в пространствах имен

Для вашего третьего вопроса, определение функций отдельно от их декларации, возможно,.

namespace first 
{ 
    void test(); 
} 

void first::test() 
{ 
    std::cout<<"This is the first one \n"; 
} 
+0

Да согласился, что пространство имена может быть объявлены под пространством имен вложенности namespace, но почему пространство имен не может быть объявлено внутри тела функции. Я не могу достичь ничего хорошего, но я просто хочу знать причину этого –

+1

@RohitSaluja: потому что стандартный комитет не добавляет функции «потому что они могут». Они добавляют функции, когда кто-то показывает им, что эта функция будет полезна, совместима и стоит усилий, требуя от разработчиков-компиляторов ее реализации. По-видимому, никто не сделал такого случая для пространств имен, объявленных внутри тела функции. (И почему вы, то, что вы объявляете внутри функции, являются локальными для функции в любом случае, поэтому почему пространства имен?) – DevSolar

+0

Пространство имен представляет область, в которой гарантируется, что все идентификаторы, объявленные внутри нее, являются уникальными (если только в пределах вложенных областей). Составной оператор (начинающийся с '{' и заканчивающийся '' ') уже имеет именно это свойство, как и тело функции. Поэтому разрешение пространства имен внутри функции (или внутри составного оператора) не является необходимым. Нет такой функции языка, которая не может быть достигнута более легко, поэтому нет никакой ценности в ее поддержке. – Peter

0

Ответ на вопросы четко документированы в http://www.cplusplus.com/doc/tutorial/namespaces/

+0

я прошел через этот документ, я понял, использование пространства имен, но это не мой вопрос адрес –

0

Погрешность вы получаете не из-за перегрузки, но из-за неоднозначность из test(): Компилятор «видит» два определения, first::test() и second::test(), без подсказки, какой из них использовать.

using namespace second;добавляет идентификаторы от second:: в глобальное пространство имен; это не скрыть любые, которые уже являются глобальными (либо определены глобально, либо ранее введены через using namespace). Так оно и работает.

Кроме того, пространства имен могут быть объявлены либо в глобальном масштабе, либо внутри других пространств имен ; они не могут быть объявлены внутри тел функции (как вы выяснили).

Это, как говорится, «пробная версия и ошибка» (что принимает данный компилятор или нет) является плохой привычкой. То, что вы изучаете, - это не «язык», а конкретная реализация . Разница вернется, чтобы преследовать вас, если ваш код в один прекрасный день должен скомпилироваться в другой реализации или работать на другой платформе.

Для устранения двусмысленности вы всегда можете использовать полные имена, first::test() и second::test(), как при определении, так и при вызове функций.

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