C ++: создание объекта без пространства имен - PullRequest
0 голосов
/ 11 декабря 2018

Я застрял с двумя .hpp файлами, которые имеют много классов / методов с одинаковыми именами и так далее.Моя проблема в том, что A.hpp заключен в namespace, поэтому я могу использовать все, что захочу, используя> A::className objName(...);

Но я не знаю, как использовать что-либо из B.hpp, что необернутый в пространство имен, поэтому я не могу написать B::className objName(...).

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

Спасибо.

1 Ответ

0 голосов
/ 11 декабря 2018

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

::classFromB foo(/*...*/);
::globalFuncFromB( foo, &::globalVarFromB ); // Obviously this gets rather tedious.

Во-вторых, предполагая, что нет using директивы (using namespace A;) или декларации (using conflictsWithB = A::className), или другие декларации создают конфликт, вы можете, как правило, полагаться на неквалифицированный поиск:

classFromB foo(/*...*/);
globalFuncFromB( foo, &globalVarFromB  );

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

namespace B {
#include "B.hpp"
}

Это имеет множество потенциальных проблем, особенно если предполагается, что любые объявления в B.hpp определены или фактически определены либо в самом заголовке, либо в другом месте (реализация B.cpp?) в глобальном масштабе.Не лучшая идея, но иногда полезная. Будьте очень осторожны, если рассмотрите этот подход.

...