Форвардное объявление структуры для Boost-графа typedef Stack Overflow

Краткое описание проблемы:

В основном хочу

struct Type;
typedef container<Type> MyType;
struct Type{
MyType::sometype member;
}

Теперь, как мне это сделать?

Актуальная проблема:

Для Повышение Succesive Кратчайший путь алгоритм, мне нужно, чтобы мои передние края были сопоставлены с их обратным. У меня есть следующий код:

struct VertexProperty { };
struct EdgeProperty;
typedef boost::adjacency_list<boost::vecS, boost::vecS, boost::directedS, VertexProperty, EdgeProperty> DirectedGraph;

struct EdgeProperty {
double edge_capacity; //capacity: 1 for forward, 0 for reverse
double edge_weight; //cost
DirectedGraph::edge_descriptor reverse_edge; //reverse edge mapping

//forward edge constructor:
EdgeProperty(double distance, DirectedGraph::edge_descriptor reverseEdge) :
edge_capacity(1), edge_weight(distance), reverse_edge(reverseEdge) {
};

//reverse edge constructor
EdgeProperty(double distance) :
edge_capacity(0), edge_weight(-distance) {
};

};

Однако теперь я получаю следующую ошибку:

/usr/include/boost/pending/property.hpp:35:7: error: ‘boost::property<Tag, T, Base>::m_value’ has incomplete type
../src/Tester.cpp:21:8: error: forward declaration of ‘struct EdgeProperty’

Я думаю, это имеет смысл: для DirectedGraph :: edge_descriptor мне нужен полный тип EdgeProperty, но этот, конечно, не инициализирован. Как мне разрешить эту циркулярную ссылку?

4

Решение

Проблема в том, что struct Type не может быть определено (до размеров и структуры памяти) until container<Type> создается и определяется, но это зависит от определения struct Type…. приводя к круговой зависимости.

Прервите зависимость, используя указатель или умный указатель, размер и макет которого можно определить до определения его указательного типа.

Например:

#include <vector>
#include <memory>

struct Type;
typedef std::vector<Type> MyType;
struct Type{
std::shared_ptr<MyType::value_type> member;
};

int main() {
Type t;
}

И вы можете сослаться на Когда я могу использовать предварительную декларацию? для более подробной информации о предварительных декларациях …

1

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