【发布时间】:2015-05-10 10:06:50
【问题描述】:
我试图扩展一个预先存在的类,并想为其添加新功能。 我创建了一个新类来执行新的扩展功能,但是由于这个功能对预先存在的类来说太具体了,我将类实现移动到预先存在的类的 .cpp 文件中的一个未命名的命名空间。(它在未命名的命名空间中因为它并不真正属于预先存在的类所在的命名空间。)。 每个现有的类仍然应该为这个新类存储一个指针。 我是这样实现的:
我在命名空间中有预先存在的类( xyz ): 我的 .h 看起来像这样:
// Forward declare the class
namespace
{
// This is the class in which I have kept my extended functionality
class MyClass;
}
namespace xyz
{
class Subject
{
public:
Subject();
private:
//keeping the pointer in Pr-Existing class
std::unique_ptr< MyClass > mMyClass
};
}
在 .cpp 中,我在未命名的命名空间中定义了 MyClass。
所以我的 .cpp 看起来像这样:
namespace
{
class MyClass
{
.
.
.
};
}
xyz::Subject::Subject()
{
mMyClass.reset( new MyClass() );
}
现在我无法编译程序,Compiler 认为在这两个地方声明的 MyClass 是不同的。 我收到这样的错误:
错误:对“MyClass”的引用不明确 mMyClass.reset(new MyClass)); ^ .h:注意:通过名称查找找到的候选人是“MyClass” 我的班级; ^ .cpp:注意:通过名称查找找到的候选人是 '::MyClass' class MyClass : public MyClass
我可以通过将 MyClass 保留在命名空间 xyz 中来解决它。 但是有没有办法做到这一点..?
【问题讨论】:
-
为什么不能命名命名空间,例如
namespace fwd?还是将MyClass留在snamespace 之外? -
最好将定义放入命名空间以避免污染全局命名空间。
-
每个未命名的命名空间都是唯一的。
标签: c++ class namespaces