Шаблон рекурсивного псевдонима - PullRequest
0 голосов
/ 01 июля 2018

Я создаю список смежности для моделирования ориентированного взвешенного графа , и я хотел бы знать, возможны ли рекурсивные шаблоны псевдонимов . Я пробовал что-то вроде этого

template<class edge_data>
using graph_test = std::set<std::map<std::set<graph_test>::const_pointer, edge_data>>;

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

Это приводит к ошибке: 'graph_test': undeclared identifier.

Я знаю, что мог бы использовать std::any, чтобы избежать этой проблемы, но это выглядит немного «опасно», даже если я знаю, что делаю.

Есть ли у вас какие-либо предложения / идеи, которые могут решить эту проблему?

РЕДАКТИРОВАТЬ 1: Как указал Игорь Тандетник , способ создания моего const_pointer не может быть правильным. Я придумал этот код (изменения курсивом):

template<class edge_data>
    using graph_test = std::set<std::map<graph_test<edge_data>::const_pointer, edge_data>>;

Проблема и ошибка все еще здесь, но это как минимум одна исправленная ошибка.

РЕДАКТИРОВАТЬ 2: Я взглянул на решение bipll , которое было очень актуально, и на комментарий Dani , показывающий вероятное отсутствие ключевого слова typedef. Я придумал этот кусок кода, и он компилируется:

template<class edge_data> struct graph_test
    : std::set<typename std::map<typename graph_test<edge_data>::const_pointer, edge_data>> {
    using std::map<typename graph_test<edge_data>::const_pointer, edge_data>::map;
};

Я отмечу вопрос как решенный, большое спасибо за ваше время и помощь:)

1 Ответ

0 голосов
/ 01 июля 2018

В вашем определении graph_test отсутствует параметр шаблона, а typename отсутствует. Кроме того, тип не может быть псевдонимом для себя, его расширение создаст бесконечный граф зависимостей. Вы можете сделать его реальным типом, а не псевдонимом:

template<class edge_data> struct graph_test
    :std::set<
        typename std::map<typename std::set<graph_test<edge_data>>::const_pointer, edge_data>>
{
    using std::map<typename std::set<graph_test<edge_data>>::const_pointer, edge_data>>::map;
};
...