11

我必须使用由 DLL 提供的 API,并带有这样的标头

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

有没有办法使用 ALongNameToType::ALongNameToType::Foo 而不必每次都输入 ALongNameToType::ALongNameToType ?我尝试使用using namespace ALongNameToType但在 Visual Studio 中出现模棱两可的符号错误。更改命名空间名称或删除它会给我链接器错误。

4

4 回答 4

23

我不知道什么是模棱两可的,但是您可以避免与其他 Foo 函数的所有冲突,如下所示:

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

typedef ALongNameToType::ALongNameToType Shortname;

int main() {
    Shortname::Foo();
}
于 2009-10-08T17:49:36.037 回答
3
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();
}
于 2009-10-08T17:34:50.110 回答
3
using ALongNameToType::ALongNameToType::Foo;

如果您只想将其用作Foo().

于 2009-10-08T17:58:45.583 回答
1

有三种使用方法using。一种用于整个命名空间,一种用于命名空间中的特定事物,一种用于派生类,表示它不想隐藏在基类中声明/定义的内容。您可以使用其中的第二个:

using ALongNameToType::ALongNameToType

不幸的是,这对您不起作用(由于名称空间的歧义和具有相同名称的类)。将这种类型的使用与以前的答案结合起来应该可以消除歧义:

namespace alntt = ALongNameToType;
using alntt::ALongNameToType;

但是,一旦您重命名了命名空间,您就真的不需要该using语句(只要您每次使用该类时都能轻松编写(缩短的)命名空间:

namespace alntt = ALongNameToType;
alntt::ALongNameToType a;
...
于 2009-10-08T17:59:28.357 回答