请看下面的代码。首先,创建一个包含类的命名空间。然后,扩展命名空间并使用我们之前定义的类。这是一个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/