2017-04-04 86 views
-2

這可能是一個該死的簡單問題。但我似乎無法將我的對象插入到地圖中。我很確定我不必定義自己的拷貝構造函數,因爲我只使用標準的東西。感覺像現在敲我的頭在牆上:大聲笑:,這是我試圖創建地圖:頂點的在std :: map中插入非默認構造元素

map<unsigned, Vertex> vertexes; 

頭文件

#ifndef KNOTSV2_VERTEX_H 
    #define KNOTSV2_VERTEX_H 

    #include <forward_list> 
    #include <set> 
    #include <iostream> 

    #include "VertexType.h" 

    using namespace std; 

    // Defines. 
    typedef tuple<edge_list, edge_list, edge_list> neigh_set_entry; 


    /* 
    * Matching 
    */ 
    struct match_first { 
     match_first(unsigned value) : value(value) {}; 

     template<class A> 
     bool operator()(const pair<unsigned, A> &a) { 
      return a.first == value; 
     } 
    private: 
     unsigned value; 
    }; 


    class Vertex { 
    public: 
     /* 
     * Constructors 
     */ 
     Vertex(unsigned identifier, VertexType *type, unsigned attributes) : identifier(identifier), type(type), values(attributes_vec(attributes)) {}; 

// Methods .. 
    private: 
     /* 
     * Members 
     */ 
     unsigned identifier; 
     attributes_vec values; 
     VertexType *type; 
     vector<pair<unsigned, neigh_set_entry>> neigh_set; 
    }; 

功能我試圖撥打:

Vertex& Graph::create_vertex(VertexType &type) { 
    Vertex v(id_enumerator++, &type, type.num_attributes()); 
    return vertexes[id_enumerator] = v; 
} 

注:在成員函數的實例化 '的std :: __ 1個::地圖,性病:: __ 1 ::分配器>> ::操作符[]' 這裏請求

return vertexes[id_enumerator] = v; 

      ^

注:候選人構造函數(隱式轉移構造函數)並不可行:需要1個說法,但0分別提供

class Vertex { 
    ^

注:候選人構造函數(隱式副本構造函數)不可行:

注意:候選構造函數不可行:需要3個參數,但0個是提供 頂點(無符號標識符,VertexType *類型,無符號屬性):標識符(標識符),類型(類型),值(attributes_vec(屬性)){};

所以我明白這是由於它試圖調用'正常構造函數',但我不想爲傳遞給構造函數的值創建getter和setter;因爲它們可能不會改變。作爲第二次嘗試,我嘗試使用map :: emplace,但沒有運氣。除了創建一個正常的構造函數之外,還有其他選擇嗎?

試過emplace插入和成對構造,也沒有運氣。

Vertex& Graph::create_vertex(VertexType &type) { 
    //Vertex v(); 
    return vertexes.insert(make_pair(id_enumerator, Vertex(id_enumerator, &type, type.num_attributes()))).first->second; 
} 

Vertex& Graph::create_vertex(VertexType &type) { 
    //Vertex v(); 
    return vertexes.emplace(id_enumerator, Vertex(id_enumerator, &type, type.num_attributes())).first->second; 
} 
Vertex& Graph::create_vertex(VertexType &type) { 
    //Vertex v(); 
    return vertexes.emplace(piecewise_construct, forward_as_tuple(id_enumerator), forward_as_tuple(id_enumerator, &type, type.num_attributes())).first->second; 
} 
+0

什麼編譯錯誤,你在嘗試'insert'和'emplace'時? – NathanOliver

回答

2

std::map::emplace's documentation

新元素(即std::pair<const Key, T>)被調用以完全一樣提供給佈設相同參數的構造,經由std::forward<Args>(args)...轉發。

struct Vertex 
{ 
    Vertex(unsigned identifier, int type, unsigned attributes) {} 
}; 

int main() 
{ 
    std::map<unsigned, Vertex> vertexes; 

//      Vertex 
//      vvvvvvvvvvvvvvvvv 
    vertexes.emplace(0u, Vertex{0u, 1, 0u}); 
//     ^^ 
//  const unsigned 
} 

live wandbox example