Использование класса в пространстве имен с тем же именем?

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

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

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


person Steven    schedule 08.10.2009    source источник


Ответы (4)


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

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

typedef ALongNameToType::ALongNameToType Shortname;

int main() {
    Shortname::Foo();
}
person Steve Jessop    schedule 08.10.2009
comment
Я совсем забыл typedef... +1 - person AraK; 08.10.2009
comment
на самом деле вам не нужно использовать структуру вместо класса, не так ли?? - person 2am; 13.10.2013
comment
@2am: вам не обязательно, вы можете написать class ALongNameToType { public: static void Foo(); };, если хотите, но код в вопросе нуждается в исправлении так или иначе. Обычно я использую struct для типов без непубличных членов. Вы должны изложить условия использования struct в любом руководстве по стилю, применимом к коду. Некоторые люди используют struct специально для типов POD, или специально для типов, определение которых будет компилироваться как C, или специально для типов без определяемых пользователем конструкторов или функций-членов, или просто используют его бессистемно для типов, которые они считают простыми ;-) - person Steve Jessop; 13.10.2013

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();
}
person AraK    schedule 08.10.2009

using ALongNameToType::ALongNameToType::Foo;

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

person David Thornley    schedule 08.10.2009
comment
К сожалению, у меня это не работает в Visual Studio 2008 error C2885: 'ALongNameToType::ALongNameToType::Foo': not a valid using-declaration at non-class scope - person Steven; 09.10.2009

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

using ALongNameToType::ALongNameToType

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

namespace alntt = ALongNameToType;
using alntt::ALongNameToType;

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

namespace alntt = ALongNameToType;
alntt::ALongNameToType a;
...
person Max Lybbert    schedule 08.10.2009
comment
Это дает мне error C2874: using-declaration causes a multiple declaration of 'ALongNameToType::ALongNameToType' в Visual Studio 2008 - person Steven; 09.10.2009
comment
Что ж, это полезно в тех случаях, когда нет двусмысленности (например, при использовании std::cout). - person Max Lybbert; 09.10.2009