Использование класса в пространстве имен с тем же именем?
Мне нужно использовать API, предоставляемый DLL с заголовком, подобным этому
namespace ALongNameToType {
class ALongNameToType {
static void Foo();
}
}
Есть ли способ использовать ALongNameToType:: ALongNameToType:: Foo без необходимости вводить ALONNameToType:: ALongNameToType каждый раз? Я попытался использовать using namespace ALongNameToType
, но получил неоднозначные ошибки символов в Visual Studio. Изменение имени пространства имен или удаление его дает мне ошибки компоновщика.
Ответы
Ответ 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;
...