如果我这样做,我的前向声明将不起作用:
class Manager::TagManager;
namespace UI
{
class Example
{
public:
...
Manager::TagManager* tagManager_;
};
}
它说使用未定义的类型。但是它工作得很好,如下所示:
namespace Manager
{
class TagManager;
}
//same stuff follows
那么有什么区别呢? 是“类管理器::TagManager;”不是命名空间管理器中 TagManager 的声明?
最佳答案
反问:您如何期望编译器知道 class Manager::TagManager
是否是命名空间 Manager
中类 TagManager
的声明> 还是封闭类 Manager
中嵌套类 TagManager
的声明?编译器以前从未听说过Manager
。它不知道它是类还是命名空间。这就是编译器试图通过该错误消息告诉您的内容。它实际上假设 Manager
是一个类类型(不是命名空间),尚未定义。
但是,即使它知道 Manager
是什么,它仍然无法工作。在 C++ 中,像 Name1::Name2
这样的限定名称只能用于引用现有(即已经声明的)实体。您不能使用限定名称来声明新实体。
这意味着属于某个命名空间的实体的前向声明只能通过重新打开该命名空间来完成。嵌套到类中的实体的前向声明只能在封闭类的定义内完成。
对于命名空间中的实体,这相对容易,因为您可以根据需要多次重新打开命名空间。对于类中的嵌套实体,您只有一次机会。
关于c++ - 前向声明不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17459416/