LINUX.ORG.RU

Объявления вне пространства имен

 , ,


0

2

Приветствую.

Отрывок из книги Р. Лафоре «Объектно-ориентированное программирование в С++» (611 страница)

Объявления можно помещать и вне пространства имен, и они будут работать, как если бы они были внутри него. Все, что для этого нужно, это имя пространства и оператор разрешения контекста:

namespace beta
{
	int uno;
}

int beta::dos;

В этом примере и uno, и dos являются объявлениями в пространстве имен beta.

$ gcc main.cpp
main.cpp:6:11: ошибка: «beta::dos» следовало объявить внутри «beta»
 int beta::dos;
           ^

Кто не прав?



Последнее исправление: CYB3R (всего исправлений: 1)
Ответ на: комментарий от anonymous
$ gcc main.cpp
main.cpp:6:18: ошибка: «beta::dos» следовало объявить внутри «beta»
 extern int beta::dos;
                  ^
Nietzsche
() автор топика
Ответ на: комментарий от anonymous

Мой фейл, пропустил объявление int dos;

Но это никак не сходится со словами из книги про помещение объявления вне пространства имен. И про extern ни слова в этом контексте.

Nietzsche
() автор топика
Ответ на: комментарий от Nietzsche

Но это никак не сходится со словами из книги про помещение объявления вне пространства имен. И про extern ни слова в этом контексте.

Если в книге именно так и сказано, то это ошибка автора.

anonymous
()
Ответ на: комментарий от anonymous

Я надеялся, что это ошибка наших локализаторов, но нет...

You can place declarations outside a namespace that behave as if they were inside it. All you need is the scope resolution operator and the namespace name:

namespace beta
{
int uno;
}
int beta::dos;

Here, both uno and dos are declared in the namespce beta.

Некоторые примеры из книги заточены под вижуалстудию и борланд, поэтому подумалось, что это может быть фишкой этих компилеров, но проверить не смогу. Но это точно не опечатка.

Nietzsche
() автор топика
Ответ на: комментарий от Nietzsche

Но это никак не сходится со словами из книги про помещение объявления вне пространства имен. И про extern ни слова в этом контексте.

google://объявление vs определение

без extern - это уже (пере)определение

MyTrooName ★★★★★
()
Последнее исправление: MyTrooName (всего исправлений: 1)
Ответ на: комментарий от MyTrooName

Да, я понимаю, что это объявление и определение:

int dos;

А это только объявление:

extern int dos;

И выше написали вполне работающий пример. Но это не то, о чем говорится в книге.

Nietzsche
() автор топика
Ответ на: комментарий от Deleted

Верно. Это я по привычке :)

gcc смотрит на расширение файлов, так что такое тоже прокатывает. На плюсовый код в *.c файле ругается.

$ cp main.cpp main.c
$ gcc main.c
main.c:1:1: ошибка: unknown type name «namespace»
 namespace beta
 ^
main.c:2:1: ошибка: expected «=», «,», «;», «asm» or «__attribute__» before «{» token
 {
 ^
Nietzsche
() автор топика

Р. Лафоре «Объектно-ориентированное программирование в С++»

Брось каку.

rupert ★★★★★
()
Ответ на: комментарий от Nietzsche

проверил на VS2015. ругается на код в шапке

anonymous
()
Ответ на: комментарий от SystemD-hater

Либо плохо искал, либо ub. Но ub на этапе компиляции, это, что то совсем новенькое.

pon4ik ★★★★★
()

Прочитал стандарт. Низзя так. Неявно добавить член в неймспейс можно только через friend внутри класса в неймспейсе.

Pavval ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.