C ++: вопрос о синтаксисе пространства имен - PullRequest
2 голосов
/ 23 декабря 2010
namespace Stuff
{
    class Sprite
    {
    };

    class Circle : Stuff::Sprite
    {
    };
}

Будет ли это работать или будет выглядеть Stuff :: Stuff :: Sprite?

edit: забыл несколько точек с запятой.

edit 2: Я принимаю ответ @ Omnifarious, потому что как только он отредактировал его с помощью @ Vlad, это был самый полный ответ. спасибо также @ Влад.

Ответы [ 2 ]

6 голосов
/ 23 декабря 2010

Это будет работать, если в точке определения нет видимого пространства имен Stuff::Stuff.

Пример:

namespace Stuff
{
    namespace Stuff
    {
    }

    class Sprite
    {
    };

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

Без внутреннего пространства имен Stuff это будет работать.

5 голосов
/ 23 декабря 2010

Это будет работать, если вы введете ; после определения класса. Но это не будет работать так, как вы ожидаете. Во-первых, он пытается выяснить, о каком пространстве имен вы говорите. Сначала он ищет ::Stuff::Stuff, а когда он не находит его, то ищет пространство имен ::Stuff. Он находит это пространство имен, поэтому он ищет в этом пространстве имен Sprite и находит ваш класс.

Если у вас есть незанятое пространство имен, оно ищет этот путь к пространству имен в текущем пространстве имен, затем во вложенном пространстве имен, затем во вложенном пространстве имен ... и т. Д. ... до тех пор, пока оно не достигнет пространства имен верхнего уровня.

Смотрите мой вопрос:

По моему мнению, люди должны быть намного осторожнее, чем когда они обращаются к пространствам имен. Вряд ли кто-либо когда-либо использует спецификацию пространства имен с привязкой к корневому каталогу, даже если это так, потому что они действительно означают конкретное абсолютное пространство имен, а не имя относительно текущего пространства имен.

Вот несколько интересных случаев:

 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
...