c++ - 前向声明不起作用

标签 c++ namespaces forward-declaration

如果我这样做,我的前向声明将不起作用:

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/

相关文章:

c++ - 错误 411 需要长度 c++,libcurl PUT 请求

hadoop - HDFS fsck 命令输出

c++ - typedef 相对于派生类的优势?

c - typedef 结构的前向声明

c++ - 为什么没有 <STLfwd> header ,它的不存在可以被视为缺陷吗?

c++ - 了解 TCP 校验和功能

c++ - 在执行期间更改指向函数的函数指针

c++ - 台球游戏物理速度计算问题

sql - 无法将 'WITH XMLNAMESPACES...FOR XML PATH' 的输出设置为变量?

laravel - 我应该如何在 Laravel 包中输入提示 UserModel?