Идентификатор пространства имен С++ во всей области видимости класса
Я ожидал, что смогу использовать псевдоним пространства имен в объявлении класса, но получить синтаксическую ошибку компилятора.
struct MyClass
{
namespace abc = a_big_namespace;
void fn() {
abc::test();
}
};
Единственный способ заставить его работать - поставить псевдоним в каждую функцию.
void fn() {
namespace abc = a_big_namespace;
abc::test();
}
Кроме того, я хотел бы иметь возможность использовать псевдоним для параметров функции. Я не нашел для этого работы.
void fn(abc::testType tt) {
abc::test(tt);
}
Есть ли способ сделать то, что я хочу?
EDIT: мое решение
Я обнаружил, что мне не нужно безымянное пространство имен для моей конкретной проблемы и могу просто сделать это:
namespace myspace
{
namespace abc = a_big_namespace;
struct MyClass
{
void fn(abc::testType tt) {
abc::test(tt);
}
};
}
Чтобы переключиться на другую библиотеку, к которой относится мое пространство имен псевдонимов, я просто изменяю псевдоним. Этот метод даже позволяет мне иметь один и тот же класс в одном файле дважды, каждый раз ссылаясь на другую библиотеку.
Спасибо за вашу помощь.
Ответы
Ответ 1
Псевдоним пространства имен в определении класса незаконно, как указано спецификацией языка.
разрешено только в области пространства имен или области действия.
Вы можете создавать псевдоним в области пространства имен. Но это будет сделать постоянный псевдоним, который можно использовать и из других файлов. Но решение прост: вы можете использовать неназванное пространство имен, чтобы предотвратить возможность просмотра псевдонима (и, следовательно, всех символов из большого пространства имен) из других файлов. Вот как это можно сделать:
//MyFile.cpp
namespace myspace
{
namespace //this is unnamed namespace
{
namespace abc = a_big_namespace;
}
struct MyClass
{
void fn()
{
abc::test(); //don't worry, this will work!
}
};
}
//OtherFile.cpp
myspace::abc::test(); //error - that means, prevention worked.
Псевдоним не отображается из других файлов. При компиляции OtherFile.cpp
GCC (4.5.0) говорит:
'myspace:: abc' не был объявлен
Это доказывает, что псевдоним abc
отображается только в MyFile.cpp
. Благодаря неназванному пространству имен.
Демонстрация: http://www.ideone.com/2zyNI (хотя она не демонстрирует концепцию OtherFile. У меня не может быть более одного файла на ideone.com)
Ответ 2
Он работает, если вы объявляете псевдоним вне структуры.
Ответ 3
Конечно, вы также можете поместить псевдоним вне класса:
namespace abc = a_big_namespace;
struct MyClass {
void fn()
{ abc::test(); }
};
Ответ 4
Объем псевдонимов пространства имен - это блок кода.
Итак, вы можете поместить его в любой блок кода.
НО, вы не можете поместить его внутри класса, потому что это будет означать, что он является членом класса.
Псевдоним пространства имен не может быть членом.
Подробнее о псевдонимах пространства имен:
Какова область псевдонимов пространства имен в С++?
Namespaces