C++ 在命名空间中使用同名的类?

C++ 在命名空间中使用同名的类?,c++,class,namespaces,symbols,C++,Class,Namespaces,Symbols,我必须使用DLL提供的API,其标题如下 namespace ALongNameToType { class ALongNameToType { static void Foo(); } } 有没有一种方法可以使用ALongNameToType::alongnametype::Foo而不必每次都键入alongnametype::alongnametype?我尝试使用和nametotype一起使用名称空间,但在VisualStudio中出现了不明确的符号错误

我必须使用DLL提供的API,其标题如下

namespace ALongNameToType {
    class ALongNameToType {
        static void Foo();   
    }
}
有没有一种方法可以使用ALongNameToType::alongnametype::Foo而不必每次都键入alongnametype::alongnametype?我尝试使用
和nametotype一起使用名称空间,但在VisualStudio中出现了不明确的符号错误。更改名称空间名称或删除名称空间会导致链接器错误

namespace myns = ALongNameToType;
您似乎不能像这样为类范围添加别名:

// second ALongNameToType is a class
namespace myns = ALongNameToType::ALongNameToType;
namespace ALongNameToType {
    struct ALongNameToType {
        static void Foo();   
    };
}

typedef ALongNameToType::ALongNameToType Shortname;

int main() {
    Shortname::Foo();
}
也许您可以将函数本身别名为:

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

  }
 };
}

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

 myfunc();
}

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

// second ALongNameToType is a class
namespace myns = ALongNameToType::ALongNameToType;
namespace ALongNameToType {
    struct ALongNameToType {
        static void Foo();   
    };
}

typedef ALongNameToType::ALongNameToType Shortname;

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

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

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

using ALongNameToType::ALongNameToType

不幸的是,这不适用于您(由于名称空间和同名类的不确定性)。将这种类型的使用与先前的答案相结合,应该可以消除歧义:

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

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

我完全忘记了typedef…+1您实际上不必使用struct而不是class,是吗???@2am:您不必,您可以将
类与类型{public:static void Foo();}一起编写
如果您愿意,但是问题中的代码需要以这种或那种方式修复。我通常使用
struct
来处理没有非公共成员的类型。您应该在适用于代码的任何样式指南中列出使用
struct
的条件。有些人专门使用
struct
来处理POD类型,或者所有类型Y,其定义将编译为C,或者专门针对没有用户定义的构造函数或成员函数的类型,或者只是随意地使用它们认为“简单”的类型;不幸的是,它在Visual Studio 2008中对我不起作用
错误C2885:“ALongNameToType::alongnametype::Foo”:在非类作用域中不是有效的using声明
这给了我
错误C2874:在Visual Studio 2008中使用声明会导致多个声明“alongnametype::alongnametype”
,在不存在歧义的情况下(例如,“使用std::cout”)它很有用