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

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

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

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

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

4b9b3361

Ответ 1

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

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

typedef ALongNameToType::ALongNameToType Shortname;

int main() {
    Shortname::Foo();
}

Ответ 2

namespace myns = ALongNameToType;

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

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

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

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

  }
 };
}

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

 myfunc();
}

Ответ 3

using ALongNameToType::ALongNameToType::Foo;

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

Ответ 4

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

using ALongNameToType::ALongNameToType

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

namespace alntt = ALongNameToType;
using alntt::ALongNameToType;

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

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