Форвард Определения и использование пространства имен

Я задаюсь вопросом о значении следующих строк кода в заголовок файл…

Во первых у меня стандарт using что делает класс из пространства имен видимым для моего кода

using mynamespace::myclass;

и затем предварительное объявление того же класса:

namespace mynamespace
{
class myclass;
}

и, наконец, предварительное объявление другого класса:

class myclass2;

Каковы тонкие различия для программиста при «использовании» и когда «декларирование вперед»? Что является более предпочтительным при написании заголовок файл?

2

Решение

Ваш первый вариант недействителен. Вы можете только дать заявление об использовании после предварительная декларация

namespace N { class C; } // OK, now we know that N::C exists

using N::C;              // OK, now we can type C whenever we mean N::C

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

Неофициальная аналогия с именами и фамилиями: сначала будет представлен человек, и только потом вы получите имя по имени.

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

2

Другие решения

Для того, чтобы заранее объявить класс, вам не нужно using директива, обычно лучше просто использовать полное имя в заголовке:

namespace mynamespace
{
class myclass;
}

class A{
mynamespace::myclass* ptr;

};

Также как Джрок отметил, что вы не можете использовать using привести символ в текущую область видимости до фактического (прямого) объявления символа.

2

Единственная вещь using делает — делает указанный символ доступным в текущей области видимости. Это не связано с направлением деклараций.

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

namespace mynamespace {
class myclass;
}

namespace this_header_namespace {
using mynamespace::myclass;
}
2
По вопросам рекламы [email protected]