如何共享扩展名称空间之间共享的范围?

时间:2014-09-12 17:16:48

标签: 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 {
         ^

为什么此代码不符合标准?除了每次明确提到名称空间外,我还有哪些其他选项。

3 个答案:

答案 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;
    };
}

所以?

搜索并阅读一些编码标准。它们存在是有原因的。一旦你学到了一个好主意,它就会为你的职业生涯做好准备。