C ++:命名空间语法问题

时间:2010-12-23 00:33:31

标签: c++ namespaces naming-conventions

namespace Stuff
{
    class Sprite
    {
    };

    class Circle : Stuff::Sprite
    {
    };
}

这会起作用,还是会找到Stuff :: Stuff :: Sprite?

编辑:忘了一些分号。

编辑2:我接受了@Omnifarious的回答,因为一旦他用@ Vlad的帮助编辑了它,这是最完整的答案。还要感谢@Vlad。

2 个答案:

答案 0 :(得分:6)

除非在定义点可见名称空间Stuff::Stuff,否则这将有效。

示例:

namespace Stuff
{
    namespace Stuff
    {
    }

    class Sprite
    {
    };

    class Circle : public Stuff::Sprite // compile error,
    {                                   // looks for Stuff::Stuff::Sprite
    };
}

如果没有内部命名空间Stuff,它就会起作用。

答案 1 :(得分:5)

如果你在类定义之后放入;,它将起作用。但它不会像你期望的那样工作。首先,它试图找出你正在谈论的命名空间。首先它将查找::Stuff::Stuff,当它找不到它时,它会查找名称空间::Stuff。它找到了名称空间,然后它在Sprite的名称空间中查找并找到你的类。

如果你有一个未锚定的命名空间,它会在当前命名空间中查找该命名空间路径,然后在封闭的命名空间中查找,然后在封闭的封闭命名空间...等等...直到它到达顶级命名空间。 / p>

看到我的这个问题:

在我看来,人们应该比引用命名空间更加谨慎。几乎没有人使用根锚定命名空间规范,即使它们应该是因为它们确实意味着特定的绝对命名空间而不是相对于当前命名空间的名称。

以下是一些有趣的案例:

 1 namespace Bar {
 2
 3 class A {
 4 };
 5
 6 } // end namespace ::Bar
 7
 8 namespace Foo {
 9
10 class A {
11 };
12
13 Foo::A joe; // Refers to the A declared on line 10
14
15 namespace Foo {
16 }
17
18 Foo::A fred; // Error, finds ::Foo::Foo and doesn't find A there.
19 ::Foo::A fred; // Works and refers to the A declared on line 10
20
21 Bar::A barney; // Works, and refers to the A declared on line 3
22
23 namespace Bar {
24
25 class A {
26 };
27
28 } // end namespace ::Foo::Bar
29
30 Bar::A wilma; // Works, and refers to the A declared on line 25
31 ::Bar::A betty; // Also works, and refers to the A declared on line 3
32 ::Foo::Bar::A dino; // Also works, and refers to the A declared on line 25
33 } // end namespace ::Foo