Я разбиваю циклическую зависимость включений, объявляя класс в соответствующем заголовке, однако это приводит к небольшому затруднению в существующем соглашении об использовании псевдонима типа внутри класса:
#include <memory>
class C {
public:
using Ptr = std::shared_ptr<C>;
};
В идеале было бы возможно сделать что-то вроде:
#include <memory>
class C;
using C::Ptr = std::shared_ptr<C>;
Но это невозможно, потому что C
не полный тип (пока). Я понимаю, что возможно создать псевдоним using CPtr = std::shared_ptr<C>;
, но я надеялся, что упустил что-то очевидное, используя typename
или какое-то другое ключевое слово, которое установит C
как достаточно полный тип для создания псевдонима вложенного типа.
Нет, вы не можете поместить что-то в класс, кроме как в действительности написав это внутри определения класса.
Это не вопрос того, C
это полный тип или нет. Просто C ++ не имеет никакого синтаксиса, позволяющего добавлять имя в область видимости класса (или любую область видимости), кроме как путем фактического написания его в этой области видимости.
Других решений пока нет …