Тип псевдонимов и самореференции

В качестве примера, односвязный узел списка может быть определен следующим образом

namespace example_part1
{
class node
{
node * next;
int value;
}
}

при условии, что у нас есть список только целых чисел. Этот класс может иметь член, который указывает на его собственный тип, потому что все указатели имеют одинаковый размер, независимо от размера базовой структуры данных.

Теперь, почему я не могу сделать это

namespace example_part2
{
using node = std::pair<example_part2::node *, int>;
}

?

Я знаю, что это кажется глупым примером, но я хочу знать больше причин, почему это не скомпилируется. Я на самом деле похожа на ситуацию, где это может быть полезно (не с std :: pair). Кроме того, предположим, что эти два сегмента кода взяты из разных программ, то есть у меня нет пользовательского класса узла, а также пары с псевдонимами в качестве узла в одной и той же программе.

2

Решение

Обратите внимание, что в тип-псевдоним

[идентификатор типа является] абстрактным декларатором или любым другим допустимым идентификатором типа (который может вводить
новый тип, как отмечено в type-id). Идентификатор типа не может напрямую или
косвенно ссылаться на идентификатор.

По сути, псевдонимы не могут быть рекурсивными.

2

Другие решения

При обращении к спецификации объявления псевдонимов типов в cppreference, идентификатор типа не должен прямо или косвенно ссылаться на вводимое имя:

использование идентификатора attr (необязательно) = type-id;
идентификатор — имя, которое вводится этим объявлением, которое становится либо именем типа
template-parameter-list — список параметров шаблона, как в шаблоне
объявление type-id — абстрактный декларатор или любой другой допустимый type-id
(который может вводить новый тип, как отмечено в идентификаторе типа). Идентификатор типа
не может прямо или косвенно ссылаться на идентификатор
. Обратите внимание, что точка
декларации идентификатора в точке с запятой
тип-идентификатор.

Что касается пространств имен, обратите внимание, что node в std::pair<node *, int> не относится к node пространства имен example_part1 и, следовательно, остается неопределенным именем типа.

3

По вопросам рекламы [email protected]