请查看以下代码。首先,创建一个包含类的命名空间。然后,扩展名称空间并使用我们之前定义的类。这是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 {
^
为什么此代码不符合标准?除了每次明确提到名称空间外,我还有哪些其他选项。
答案 0 :(得分:1)
在本声明中
module *module;
您重新定义了名称模块。
因此,在成员函数声明中,您必须使用精心设计的类型名称
entry( class module *module);
无论如何,以这种方式重新定义名称是个坏主意。
答案 1 :(得分:1)
正如在另一个答案中已经指出的那样,编译器抱怨你已经将标识符的语义从类型更改为变量名称(module
)。
您应该为您的类型指定一个名称,使其易于与变量区分开来。您应该提供可以轻松区分常规变量的成员变量名称。这增加了代码的可读性和可维护性。并且,它具有使您面临的问题无副问题的副作用:
// File one
namespace system {
class module_type {
// ...
};
}
// File two including file one
namespace system {
struct entry {
entry(module_type *module);
module_type *module_;
};
}
答案 2 :(得分:1)
// File one
namespace system {
class module {
// ...
};
}
// File two including file one
namespace system {
struct entry {
entry(module *module);
module *module;
};
}
我无法真正想出更具描述性的名字
命名是程序员面临的最困难的挑战之一,然而,当以某种方式(或2或n)显示时,它将永远变得更容易。
我提供以下内容 - 来自我长期使用的编码标准。
class and namespace names are Capitalized, at least the 1st char
variable names are lower case (or camel case with lower case 1st char)
// File one
namespace System {
class Module {
// ...
};
}
// File two including file one
namespace System {
struct Entry {
Entry(Module* module);
Module* module;
};
}
所以?
搜索并阅读一些编码标准。它们存在是有原因的。一旦你学到了一个好主意,它就会为你的职业生涯做好准备。