Я недавно застрял в такой ситуации:
class A
{
public:
typedef struct/class {...} B;
...
C::D *someField;
}
class C
{
public:
typedef struct/class {...} D;
...
A::B *someField;
}
Обычно вы можете объявить имя класса:
class A;
Но вы не можете форвард объявить вложенный тип, следующее вызывает ошибку компиляции.
class C::D;
Любые идеи?
c++
class
nested
forward-declaration
Calmarius
источник
источник
Ответы:
Вы не можете сделать это, это дыра в языке C ++. Вам нужно будет удалить хотя бы один из вложенных классов.
источник
Мне нужна была прямая ссылка, как:
Мой обходной путь был:
Позже, когда я смог использовать полное определение:
Этот метод, вероятно, принесет больше хлопот, чем стоит, если бы существовали сложные конструкторы или другие специальные функции-члены, которые не были унаследованы гладко. Я мог вообразить некую магию шаблона, плохо реагирующую.
Но в моем очень простом случае это похоже на работу.
источник
using basename::basename;
в производном классе, поэтому нет проблем со сложными ctors.typedef
Если вы действительно хотите избежать #include заголовочного файла в вашем заголовочном файле, вы можете сделать это:
hpp файл:
файл cpp
Но потом:
Итак, да, компромиссы ...
источник
hpp
файл?Это может быть сделано путем предварительного объявления внешнего класса как пространства имен .
Пример: мы должны использовать вложенный класс others :: A :: Nested в others_a.h, который находится вне нашего контроля.
others_a.h
my_class.h
my_class.cpp
источник
a::b
он искажается одинаково, независимо от того,a
является ли класс или пространство имен.Я бы не назвал это ответом, но тем не менее интересная находка: если вы повторяете объявление вашей структуры в пространстве имен C, все в порядке (по крайней мере, в gcc). Когда определение класса C найдено, оно, по-видимому, молча перезаписывает пространство имен C.
источник
Это будет обходной путь (по крайней мере, для проблемы, описанной в вопросе, а не для реальной проблемы, т. Е. Когда нет контроля над определением
C
):источник
Если у вас есть доступ для изменения исходного кода классов C и D, то вы можете отдельно извлечь класс D и ввести для него синоним в классе C:
источник