c++ - 如何共享扩展命名空间之间共享的范围?

标签 c++ compiler-errors namespaces

请看下面的代码。首先,创建一个包含类的命名空间。然后,扩展命名空间并使用我们之前定义的类。这是一个live demo .

// File one
namespace system {
    class module {
        // ...
    };
}

// File two including file one
namespace system {
    struct entry {
        entry(module *module);
        module *module;
    };
}

在没有 permissive 标志的情况下在 gcc 4.8.1 下编译会产生两个编译器错误。像 system::module 这样明确提及命名空间可以解决问题,即使它与我们已经在的命名空间相同。

error: declaration of ‘system::module* system::entry::module’ [-fpermissive]
    module *module;
            ^
error: changes meaning of ‘module’ from ‘class system::module’ [-fpermissive]
   class module {
         ^

为什么这段代码不符合标准?除了每次都明确提及 namespace 之外,我还有什么其他选择。

最佳答案

正如在另一个答案中已经指出的那样,编译器提示您已将标识符的语义从类型更改为变量名 (module)。

你应该给你的类型起一个名字,使它们很容易与变量区分开来。您应该为成员变量命名,以便于与常规变量区分开来。这增加了代码的可读性和可维护性。而且,它的副作用是让您面临的问题不再是问题:

// File one
namespace system {
    class module_type {
        // ...
    };
}

// File two including file one
namespace system {
    struct entry {
        entry(module_type *module);
        module_type *module_;
    };
}

关于c++ - 如何共享扩展命名空间之间共享的范围?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25813523/

相关文章:

c++ - 基于 vector 获取范围内的项目索引

java - 为什么程序员说 "pass by reference"真的是 "passing references by value?"为什么这很重要?

objective-c - Xcode Objective-C 错误需要一些帮助 :)

c++ - 从构造函数调用虚函数和纯虚函数

ruby - 包含 ruby​​ 模块层次结构的一部分

c# - 如何从 QByteArray 获取结构

c++ - 如果我已完成当前功能,如何选择继续执行另一个功能?

java - 具有泛型优势的多值类型映射

没有项目名称的 VB.NET 导入

c# - 如何将命名空间检索到字符串 C#