Используя класс в пространстве имен с тем же именем? - PullRequest
11 голосов
/ 08 октября 2009

Я должен использовать API, предоставляемый DLL-библиотекой с таким заголовком

namespace ALongNameToType {
    class ALongNameToType {
        static void Foo();   
    }
}

Есть ли способ использовать ALongNameToType :: ALongNameToType :: Foo без необходимости каждый раз вводить ALongNameToType :: ALongNameToType? Я пытался использовать using namespace ALongNameToType, но получил неоднозначные ошибки символов в Visual Studio. Изменение имени пространства имен или удаление его приводит к ошибкам компоновщика.

Ответы [ 4 ]

20 голосов
/ 08 октября 2009

Я не знаю, что двусмысленно, но вы можете избежать всех конфликтов с другими функциями Foo, как это:

namespace ALongNameToType {
    struct ALongNameToType {
        static void Foo();   
    };
}

typedef ALongNameToType::ALongNameToType Shortname;

int main() {
    Shortname::Foo();
}
3 голосов
/ 08 октября 2009
using ALongNameToType::ALongNameToType::Foo;

, если вы просто хотите использовать его как Foo().

3 голосов
/ 08 октября 2009
namespace myns = ALongNameToType;

Похоже, вы не можете создать псевдоним для класса, как этот:

// second ALongNameToType is a class
namespace myns = ALongNameToType::ALongNameToType;

Может быть, вы могли бы использовать псевдоним саму функцию:

namespace foo
{
 class foo
 {
 public:
  static void fun()
  {

  }
 };
}

int main()
{
 void (*myfunc)() = foo::foo::fun;

 myfunc();
}
1 голос
/ 08 октября 2009

Существует три способа использования using. Один - для всего пространства имен, другой - для определенных вещей в пространстве имен, а другой - для производного класса, который говорит, что не хочет скрывать что-то, объявленное / определенное в базовом классе. Вы можете использовать второй из них:

using ALongNameToType::ALongNameToType

К сожалению, это не работает для вас (из-за неоднозначности пространства имен и класса с одинаковым именем). Сочетание этого типа использования с предыдущим ответом должно избавить от неоднозначности:

namespace alntt = ALongNameToType;
using alntt::ALongNameToType;

Но как только вы переименовали пространство имен, вам действительно не нужен оператор using (если вы спокойно пишете (сокращенное) пространство имен каждый раз, когда используете класс:

namespace alntt = ALongNameToType;
alntt::ALongNameToType a;
...
...