Подтвердить что ты не робот

Идентификатор пространства имен С++ во всей области видимости класса

Я ожидал, что смогу использовать псевдоним пространства имен в объявлении класса, но получить синтаксическую ошибку компилятора.

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);
       }
    };
}

Чтобы переключиться на другую библиотеку, к которой относится мое пространство имен псевдонимов, я просто изменяю псевдоним. Этот метод даже позволяет мне иметь один и тот же класс в одном файле дважды, каждый раз ссылаясь на другую библиотеку. Спасибо за вашу помощь.

4b9b3361

Ответ 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