在标头中使用命名空间可见性

时间:2011-03-06 17:28:35

标签: c++ visual-studio visual-studio-2010

我正在研究一个c ++库,它被分成多个命名空间。因为我试图避免头文件中的“using”指令,所以我不得不为变量,返回和参数做替代的“namespace :: class”。你可以想象这可能会变得混乱。所以,我尝试将using语句放在命名空间decloration中(见下文),这似乎可以解决问题,它似乎在包含此文件的文件中不可见。

namespace Project
{
    namespace Utility { class A; }

namespace System
{
    using Utility::A;

    class B
    {
        A *a;   // instead of Utility::A *a
    };
}
}

我的问题是,这样做可以吗?

3 个答案:

答案 0 :(得分:2)

// your header

namespace Project
{
    namespace Utility { class A; }

namespace System
{
    using Utility::A;

    class B
    {
        A *a;   // instead of Utility::A *a
    };
}
}

// end your header

class A {};

int main()
{
    using namespace Project::System;
    A a;
}

test.cpp:25:5: error: reference to 'A' is ambiguous
    A a;
    ^
test.cpp:20:7: note: candidate found by name lookup is 'A'
class A {};
      ^
test.cpp:9:20: note: candidate found by name lookup is 'Project::System::A'
    using Utility::A;
                   ^
1 error generated.

答案 1 :(得分:1)

如果没别的话,那就不那么糟了。

另一方面,我认为在使用全名时拼写全名并不“麻烦”。对我而言,这只会增加代码的清晰度。

答案 2 :(得分:0)

命名空间可以像其他任何东西一样被过度使用。如果您的代码由于命名空间而变得混乱,那么很好地表明您可能过度使用它们。

如果使用命名空间来分隔独立域,则不应过于频繁地指定它们。