在名称空间中使用具有相同名称的类?

时间:2009-10-08 17:32:29

标签: c++ class namespaces symbols

我必须使用DLL提供的API以及像这样的标题

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

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

4 个答案:

答案 0 :(得分:20)

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

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

typedef ALongNameToType::ALongNameToType Shortname;

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

答案 1 :(得分: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();
}

答案 2 :(得分:3)

using ALongNameToType::ALongNameToType::Foo;

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

答案 3 :(得分:1)

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

using ALongNameToType::ALongNameToType

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

namespace alntt = ALongNameToType;
using alntt::ALongNameToType;

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

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