【发布时间】:2020-07-20 10:14:09
【问题描述】:
是否可以使用在没有命名空间的命名空间中声明的类名?
我试过这样:
//MyClass.h
namespace MyNamespace {
class MyClass;
}
class MyNamespace::MyClass {
public:
/* ... */
}
//MyOtherClass.cpp
#include "MyClass.h"
using namespace MyNamespace;
void MyOtherClass::MyFunction() {
MyClass *myClass = new MyClass;
}
但它不起作用。 编译器说“MyClass 不明确。”
我想这段代码会起作用:
//MyOtherClass.cpp
#include "MyClass.h"
using namespace MyNamespace;
void MyOtherClass::MyFunction() {
MyNamespace::MyClass *myClass = new MyClass;
}
但这对我来说很不舒服。 我想使用没有“MyNamespace::”的“MyClass”。
有可能吗?
感谢您的帮助。
我得到了答案:不可能。
C++ 类有自己的默认命名空间。如果我声明MyNamespace,则有两个与MyClass 关联的命名空间。如果我使用MyClass 而不选择我想要使用的命名空间,编译器会感到模棱两可我真正想要使用的命名空间。所以它会告诉我“MyClassis ambiguous.”
【问题讨论】:
-
编译器是否告诉您
MyClass的两个(或更多)定义在哪里它认为是模棱两可的?什么是MyOtherClass,它是如何定义的? -
为你的代码创建一个“工作”minimal reproducible example can't replicate your problem。
-
@1201ProgramAlarm(抱歉英语不好)我把你的词“MyClass的定义”写成
MyClass *myClass = new MyClass;这样的代码。如果我是对的,答案是肯定的。编译器告诉我MyClass与使用MyClass的每个代码都模棱两可。 -
@1201ProgramAlarm 关于你的第二个问题,我认为
MyOtherClass是如何定义的并不是这个问题的关键。
标签: c++ namespaces