Псевдоним пространства имен C ++ во всей области видимости - PullRequest
29 голосов
/ 19 мая 2011

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

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

Есть ли способ сделать то, что я хочу?

РЕДАКТИРОВАТЬ: мое решение

Я обнаружил, чтоМне не нужно безымянное пространство имен для моей конкретной проблемы, и я могу просто сделать это:

namespace myspace
{
    namespace abc = a_big_namespace;

    struct MyClass
    {
       void fn(abc::testType tt) {
          abc::test(tt);
       }
    };
}

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

Ответы [ 4 ]

32 голосов
/ 19 мая 2011

Псевдоним пространства имен в определении класса недопустим , как указано в спецификации языка.

Его разрешено в только в области имен или в области функций.

Вы можете создать псевдоним в области имен.Но это будет постоянный псевдоним, который можно использовать и из других файлов.Но решение простое: вы можете использовать безымянное пространство имен, чтобы запретить отображение псевдонима (и, следовательно, всех символов большого пространства имен) из других файлов.Вот как это можно сделать:

//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)

1 голос
/ 19 мая 2011

Область действия псевдоним пространства имен является блоком кода.

Таким образом, вы можете поместить его в любой блок кода.

НО, вы не можете поместить его в класс, потому что это будет означать, что он является членом класса.
Пространство именпсевдоним не может быть членом.

Подробнее о псевдонимах пространства имен:

Какова область действия псевдонима пространства имен в C ++?
Пространства имен

0 голосов
/ 19 мая 2011

Конечно, вы также можете поместить псевдоним вне класс:

namespace abc = a_big_namespace;     

struct MyClass {
    void fn()
    { abc::test(); } 
}; 
0 голосов
/ 19 мая 2011

Работает, если вы объявляете псевдоним вне структуры.

...