невозможно преобразовать 'std :: необязательный <int>' в '__gnu_cxx :: __ alloc_traits <std :: allocator <char>> :: value_type {aka char}' - PullRequest
0 голосов
/ 16 апреля 2019

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

error: cannot convert 'std::optional<int>' to '__gnu_cxx::__alloc_traits<std::allocator<char> >::value_type {aka char}' in assignment
     vertices_.at(vertex1_id)[vertex2_id] = opt;

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

vector<vector<optional<E>>> edges_; // this is adjacency matrix
vector<V> vertices_;

void Graph<V,E>::insertVertex(const V &vertex_data) {
    this->vertices_.push_back(vertex_data);
    this->edges_.emplace_back(vector<optional<E>>());
    int k = this->edges_.size() - 2;
    int num_of_optionals_to_add = 1; // below I adjust matrix size and fill with empty optionals
    while(k >= 0) {
        for(int i = 0; i < num_of_optionals_to_add; i++ ) {
            this->edges_[k].emplace_back(optional<E>());
        }
        num_of_optionals_to_add++;
    }
}

void Graph<V,E>::insertEdge(std::size_t vertex1_id, std::size_t vertex2_id, E edge) {
    optional<E> opt(edge);
    vertices_[vertex1_id][vertex2_id] = opt;    //  error here
}

//alternative version, also doesn't work..

void Graph<V,E>::insertEdge(std::size_t vertex1_id, std::size_t vertex2_id, E edge) {
    vertices_[vertex1_id][vertex2_id].value(edge);
}

// TEST
Graph<std::string, int> g;
g.insertVertex("V1");
g.insertVertex("V2");
g.insertVertex("V3");
g.insertVertex("V4");
g.insertEdge(0, 0, 1);

1 Ответ

0 голосов
/ 16 апреля 2019
vertices_[vertex1_id][vertex2_id] = opt;

предположительно должно быть:

edges_[vertex1_id][vertex2_id] = opt;
...