代码之家  ›  专栏  ›  技术社区  ›  franji1 James Curran

在C++中我可以“向前声明”什么?

  •  8
  • franji1 James Curran  · 技术社区  · 14 年前

    我知道我能做到

    class Foo;
    

    而且很可能

    struct Bar;
    

    和全局函数

    bool IsValid(int iVal);
    

    类型化枚举呢?未声明类中的类型化枚举如何?有未声明类的函数如何?未声明类中的静态成员如何?在一个未知的名称空间中这些呢?我是否遗漏了其他可以转发声明的内容?

    1 回复  |  直到 14 年前
        1
  •  12
  •   Johannes Schaub - litb    14 年前

    你可以转寄申报单

    • 模板,包括部分专用化
    • 显式专门化
    • 嵌套类(包括结构、“真实”类和联合)
    • 非嵌套类和本地类
    • 变量(“extern int a;“)
    • 功能

    如果通过“前向声明”严格表示“声明但不定义”,则还可以前向声明成员函数。但一旦它们被声明,就不能在它们的类定义中重新声明它们。不能转发声明枚举。我不确定我是否错过了什么。

    请注意,上面列出的所有前向声明(部分和显式专用化除外)都需要使用非限定名称声明,并且成员函数和嵌套类只能在其类定义中声明,但不能在其类定义中定义。

    class A { };
    class A::B; // not legal
    
    namespace A { }
    void A::f(); // not legal
    
    namespace A { void f(); } // legal
    
    class B { class C; }; // legal
    class B::C; // declaration-only not legal
    
    class D { template<typename T> class E; };
    template<typename T> class D::E<T*>; // legal (c.f. 14.5.4/6)
    
    推荐文章