Я создаю список смежности для моделирования ориентированного взвешенного графа , и я хотел бы знать, возможны ли рекурсивные шаблоны псевдонимов .
Я пробовал что-то вроде этого
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;
};
Я отмечу вопрос как решенный, большое спасибо за ваше время и помощь:)