Как объявить самореферентный контейнер в С++?

При a typedef a struct в C я не могу этого сделать:

typedef struct {
    unsigned id;
    node_t *left;
    node_t *right;
} node_t;

потому что node_t неизвестно до тех пор, пока оно не определено, поэтому оно не может использоваться в собственном определении. Немного Catch-22. Тем не менее, я могу использовать это обходное решение для создания желаемого самореферентного типа:

typedef struct node_s node_t;
struct node_s {
    unsigned id;
    node_t *left;
    node_t *right;
};

Аналогично, я хотел бы сделать что-то подобное для контейнера С++, ссылающегося на себя:

typedef pair<unsigned, pair<node_t *, node_t * > > node_t;

но, конечно, компилятор жалуется, что он никогда не слышал о node_t, прежде чем он определил node_t, как это было бы для struct typedef выше.

Так есть обходной путь, как для struct? Или лучший способ сделать это? (И нет, я не хочу использовать указатели void.)

Ответ 1

Вы можете сделать это следующим образом:

struct node_t : std::pair<unsigned, std::pair<node_t *, node_t * > >
{};

После struct node_t компилятор знает, что существует тип с именем node_t, похожий на объявление вперед.

Ответ 2

Язык не поддерживает форвардное объявление typedef s. Следовательно, вы не можете использовать:

typedef pair<unsigned, pair<node_t *, node_t * > > node_t;

Вы можете реализовать понятие контейнера, используя struct node_t {...};, который, я уверен, не нуждается в разработке.