Ответ 1
Вы можете сделать это следующим образом:
struct node_t : std::pair<unsigned, std::pair<node_t *, node_t * > >
{};
После struct node_t
компилятор знает, что существует тип с именем node_t
, похожий на объявление вперед.
При 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
.)
Вы можете сделать это следующим образом:
struct node_t : std::pair<unsigned, std::pair<node_t *, node_t * > >
{};
После struct node_t
компилятор знает, что существует тип с именем node_t
, похожий на объявление вперед.
Язык не поддерживает форвардное объявление typedef
s. Следовательно, вы не можете использовать:
typedef pair<unsigned, pair<node_t *, node_t * > > node_t;
Вы можете реализовать понятие контейнера, используя struct node_t {...};
, который, я уверен, не нуждается в разработке.