Ответ 1
Вы можете использовать ::abc::xx
, то есть идентифицировать переменную или тип как ее абсолютный путь пространства имен. Если вы не укажете абсолютное имя, относительные имена начнут перемещаться вверх в пространстве имен/классов.
Скажем, у меня есть класс под названием "foo" в пространстве имен "abc"...
namespace abc {
class foo {
int a;
int b;
};
}
... а затем скажем, что у меня есть другой класс с именем "abc" в другом пространстве имен
#include "foo.h"
namespace foo {
class abc {
abc::a = 10;
};
}
abc:: a не будет определенным типом, потому что он будет искать класс abc, а не пространство имен abc. Как я могу сделать ссылку на объект в другом пространстве имен, где это другое пространство имен имеет то же имя, что и класс, в котором я находится?
Вы можете использовать ::abc::xx
, то есть идентифицировать переменную или тип как ее абсолютный путь пространства имен. Если вы не укажете абсолютное имя, относительные имена начнут перемещаться вверх в пространстве имен/классов.
Вы можете использовать префикс ::
для обозначения начала из глобального пространства имен, поэтому в вашем случае ::abc
будет обозначать пространство имен abc
из вашего первого фрагмента кода.
Вы можете указать полное имя, начинающееся с ::
, которое определяет глобальное пространство имен, например:
namespace abc {
class foo {
int a;
int b;
};
}
namespace foo {
class abc {
::abc::foo a; // Changed from 'abc::a = 10;' since it doesn't compile
};
}