Циклический шаблон

Предположим, что класс шаблона A определен следующим образом:

template <typename T>
class A
{
    B<T> b;
};

Предположим, что класс шаблона B определен следующим образом:

template <typename T>
class B
{
    A<T> a;
};

В идеале эти классы должны быть определены в отдельных заголовках со встроенными реализациями. Однако это вызовет проблему циклического включения. Одно из решений — поместить реализацию шаблонных классов в файл cpp. Однако для этого потребуются специализированные экземпляры шаблонов.

Есть ли способ сохранить встроенную реализацию классов и избежать циклической зависимости включения? Я хотел бы избежать использования указателей, если это возможно.

Спасибо,

Сэм


person Sam Hertz    schedule 03.05.2012    source источник
comment
Вы не можете этого сделать, так как это потребует бесконечного объема памяти. Здесь вы должны использовать указатели или ссылки.   -  person    schedule 04.05.2012
comment
@classdaknok_t да, я думаю, ты прав. Мне может понадобиться использовать указатели...   -  person Sam Hertz    schedule 04.05.2012


Ответы (1)


Вперед объявите свои классы и используйте защиту заголовков (или нестандартную #pragma один раз). http://www.parashift.com/c++-faq-lite/misc-technical-issues.html#faq-39.11

Обратите внимание, что два класса не могут полностью содержать объект друг друга. Это описывает объект бесконечного размера...
http://www.parashift.com/c++-faq-lite/misc-technical-issues.html#faq-39.12

person log0    schedule 03.05.2012
comment
Не будет ли перенаправленное объявление класса работать только в том случае, если он держит указатель (или ссылку) на другой класс? - person SirGuy; 04.05.2012
comment
Да, по крайней мере, один из классов должен ссылаться на другой с помощью указателя или ссылки. В любом случае, иначе это было бы нонсенсом, поскольку оно описывало бы бесконечно большой объект. parashift.com/c++-faq-lite/ misc-technical-issues.html#faq-39.12 - person log0; 04.05.2012