C++ 在命名空间中使用同名的类?
我必须使用DLL提供的API,其标题如下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中出现了不明确的符号错误
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”)它很有用