【问题标题】:Defining a class within a namespace在命名空间中定义一个类
【发布时间】:2010-10-12 01:18:33
【问题描述】:

有没有比这个更简洁的方法在命名空间中定义一个类:

namespace ns { class A {}; }

我希望像 class ns::A {}; 这样的东西会起作用,但可惜不是。

【问题讨论】:

    标签: c++ class syntax namespaces definition


    【解决方案1】:

    你已经接近了,你可以在命名空间中前向声明类,然后如果你想在外面定义它:

    namespace ns {
        class A; // just tell the compiler to expect a class def
    }
    
    class ns::A {
        // define here
    };
    

    你不能做的是在没有成员的命名空间中定义类,然后在命名空间之外再次定义类。这违反了单一定义规则(或类似的废话)。

    【讨论】:

    • 谢谢。这不是更简洁,但它似乎是有道理的。
    • 我认为没有比namespace ns { class A {}; } 更简洁易读的版本,但这可能只是个人意见。
    • 就是声明和定义的分离。
    【解决方案2】:

    你可以这样做,但它并不是更简洁。

    namespace ns {
        class A;
    }
    
    class ns::A {
    };
    

    或者

    namespace ns {
        class B;
    }
    
    using ns::B;
    class B {
    };
    

    【讨论】:

      【解决方案3】:

      您应该阅读的部分是:

      7.3.1.2 命名空间成员定义

      3 在命名空间中首先声明的每个名称都是该命名空间的成员。[...]

      请注意术语 -- 声明,因此 D.Shawley(和他的示例)是正确的。

      【讨论】:

        【解决方案4】:

        不,你不能。引用 C++ 标准,第 3.3.5 节:

        在所有命名或之外声明的名称 未命名的命名空间(7.3),块 (6.3), 乐趣 (8.3.5), 函数 定义(8.4)和类(条款 9) 具有全局命名空间范围

        所以声明必须在命名空间块内——定义当然可以在它之外。

        【讨论】:

        • 好吧,A类{};是定义,而不是声明。那么,您确定报价适用吗?
        • 嗯,没有经过深思熟虑 - 但我很确定这句话适用 - 我会再看看。
        猜你喜欢
        • 2014-10-06
        • 2021-11-10
        • 2014-10-18
        • 2012-05-27
        • 1970-01-01
        • 2011-01-15
        • 2014-04-26
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多