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

#c #namespaces #forward-declaration

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

Вопрос:

У меня проблема с прямыми объявлениями и пространствами имен. Следующий пример кода:

 namespace Waalkes
{
   class Otto;
}

namespace Comedian
{
    class MyClass : public ...
    {
        ...
        Waalkes::Otto getFun();
        ...
    }
}
  

Обычно это не должно быть проблемой, «Waalkes:: Otto getFun()» напрямую ссылается на прямое объявление сверху. К сожалению, некоторые программисты решили также иметь пространство имен «Comedian::Waalkes», которое определено в одном из заголовков, включенных в этот код. Так происходит, что компилятор пытается найти «Comedian :: Waalkes :: Otto», которого не существует.

Поскольку невозможно избавиться от этих уродливых двойных имен: какие у меня есть варианты? Есть ли возможность определить getFun() таким образом, чтобы его возвращаемое значение ссылалось на правильное пространство имен «Waalkes:: Otto», а не на «Comedian :: Waalkes :: Otto» из-за включающего «пространство имен Comedian»? Возможно, какой-то родительский заполнитель пространства имен?

Спасибо!

Ответ №1:

Вы можете конкретно ссылаться на Waalkes пространство имен в глобальном пространстве имен с ::Waalkes помощью . Так что, если вам нужен Otto класс в этом пространстве имен, сделайте ::Waalkes::Otto .

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