2014-10-06 4 views
1

오류 님의 호출에 대한 일치하는 기능을 '수 (긴 부호없는 INT *, 긴 부호없는 INT &)'union_set

table_edges[ this_relationship ] = boost::add_edge(
    table_vertices[ string(foreign_keys[i]["parent_table"].c_str()) ], 
    table_vertices[ string(foreign_keys[i]["child_table"].c_str()) ], 
    this_relationship, 
    rg 
).first; 
ds.union_set( 
    table_vertices[ string(foreign_keys[i]["parent_table"].c_str()) ], 
    table_vertices[ string(foreign_keys[i]["child_table"].c_str()) ] 
); 

는 관련이 오류 및 많은 다른 사람을 제공이 코드

/usr/include/boost/pending/detail/disjoint_sets.hpp:59:33: error: no matching function for call to ‘get(long unsigned int*&, long unsigned int&)’

번들 속성을 사용하고 있습니다.

typedef boost::adjacency_list < 
    boost::vecS, 
    boost::vecS, 
    boost::undirectedS, 
    string, 
    foreign_key_relationship 
> relational_graph; 

등급 & 상위 typedef는 전역 적으로 선언됩니다.

어떻게이 오류를 해결할 수 있습니까?


struct foreign_key_relationship{ 
    string parent_table; 
    string parent_column; 
    string child_table; 
    string child_column; 

    foreign_key_relationship(){} 

    foreign_key_relationship(string pt, string pc, string ct, string cc) : parent_table(pt), parent_column(pc), child_table(ct), child_column(cc) {} 

}; 

inline bool operator==(const foreign_key_relationship& lhs, const foreign_key_relationship& rhs) 
{ 
    return 
     lhs.parent_table == rhs.parent_table 
     && lhs.parent_column == rhs.parent_column 
     && lhs.child_table == rhs.child_table 
     && lhs.child_column == rhs.child_column 
    ; 
} 

inline bool operator<(const foreign_key_relationship& lhs, const foreign_key_relationship& rhs) 
{ 
    return 
     lhs.parent_table < rhs.parent_table 
     && lhs.parent_column < rhs.parent_column 
     && lhs.child_table < rhs.child_table 
     && lhs.child_column < rhs.child_column 
    ; 
} 

typedef boost::adjacency_list < boost::vecS, boost::vecS, boost::undirectedS, string, foreign_key_relationship > relational_graph; 
typedef boost::graph_traits<relational_graph>::vertex_descriptor relational_vertex; 
typedef boost::graph_traits<relational_graph>::vertices_size_type relational_vertex_index; 
typedef boost::graph_traits<relational_graph>::edge_descriptor relational_edge; 
typedef relational_vertex_index* relational_rank; 
typedef relational_vertex* relational_parent; 

void libpqxx_error(const pqxx_exception &e){ 
    cerr << "*** Caught pqxx_exception:\n"; 
    cerr << e.base().what() << "\n"; 
    const sql_error *s=dynamic_cast<const sql_error*>(&e.base()); 
    if (s) std::cerr << "Query was: " << s->query() << "\n"; 
} 

void connect_relational_vertices(map< foreign_key_relationship, relational_edge > &table_edges, result &foreign_keys, set<string> &tables_to_connect, map< string, relational_vertex > &table_vertices, relational_graph &rg, boost::disjoint_sets<relational_rank, relational_parent> &ds){ 
    for(unsigned i=0; i<foreign_keys.size(); i++){ 
     foreign_key_relationship this_relationship(
      foreign_keys[i]["parent_table"].c_str(), 
      foreign_keys[i]["parent_column"].c_str(), 
      foreign_keys[i]["child_table"].c_str(), 
      foreign_keys[i]["child_column"].c_str() 
     ); 
     if(!table_edges.count(this_relationship) && tables_to_connect.count(foreign_keys[i]["parent_table"].c_str()) && tables_to_connect.count(foreign_keys[i]["child_table"].c_str())){ 
      table_edges[ this_relationship ] = boost::add_edge(
       table_vertices[ string(foreign_keys[i]["parent_table"].c_str()) ], 
       table_vertices[ string(foreign_keys[i]["child_table"].c_str()) ], 
       this_relationship, 
       rg 
      ).first; 
      ds.union_set(table_vertices[ string(foreign_keys[i]["parent_table"].c_str()) ], table_vertices[ string(foreign_keys[i]["child_table"].c_str()) ]); 
     } 
    } 
} 

void add_possible_linking_vertex(result &foreign_keys, map< string, relational_vertex > &table_vertices, relational_graph &rg){ 
    for(unsigned i=0; i<foreign_keys.size(); i++){ 
     if(!table_vertices.count(foreign_keys[i]["parent_table"].c_str())){ 
      table_vertices[ foreign_keys[i]["parent_table"].c_str() ] = boost::add_vertex(foreign_keys[i]["parent_table"].c_str(), rg); 
      break; 
     } 
     if(foreign_keys[i]["child_table"].c_str()){ 
      table_vertices[ foreign_keys[i]["child_table"].c_str() ] = boost::add_vertex(foreign_keys[i]["child_table"].c_str(), rg); 
      break; 
     } 
    } 
}  

set<foreign_key_relationship> get_foreign_keys(transaction_base &t, set<string> tables_to_connect){ 
    try{ 
     result foreign_keys = t.prepared("get_foreign_keys").exec(); 

     set<foreign_key_relationship> relational_routes; 

     if(tables_to_connect.size()){ 

      relational_graph rg; 

      map< string, relational_vertex > table_vertices; 
      for(string table: tables_to_connect) 
       table_vertices[ table ] = boost::add_vertex(table, rg); 

      std::vector<relational_vertex_index> rank(num_vertices(rg)); 
      std::vector<relational_vertex> parent(num_vertices(rg)); 

      boost::disjoint_sets<relational_rank, relational_parent> ds(&rank[0], &parent[0]); 

      boost::initialize_incremental_components(rg, ds); 
      boost::incremental_components(rg, ds); 

      map< foreign_key_relationship, relational_edge > table_edges; 
      for(unsigned i=0; i<foreign_keys.size(); i++) 
       connect_relational_vertices(table_edges, foreign_keys, tables_to_connect, table_vertices, rg, ds); 

     } 

     return relational_routes; 
    } 
    catch(const pqxx_exception &e){ 
     libpqxx_error(e); 
     set<foreign_key_relationship> relational_routes; 
     return relational_routes; 
    } 
} 

것은 내가 libpqxx를 사용하고, 쿼리는 모든 외래 키 관계를 찾는 것은 here입니다.

+0

관련 코드가 충분하지 않습니다. SSCCE – sehe

+0

@sehe로 줄이십시오. 부족한 지 알려주십시오. –

답변

2

샘플 코드에 누락 된 비트를 추가하는 데 약 15 분이 소요되었습니다. 질문을 편집하고 의견을 남기려고했습니다. "슬프게도 실제 질문을 볼 시간이 없어졌습니다".

그러나 실제 질문은 "왜 컴파일되지 않습니까?"라는 질문을 받았습니다.

그렇다면이 파일은 저를 위해 컴파일되므로 어쩌면 이것이 당신이 전혀 다른 것이 아닌지 알아낼 수 있을까요?

#include <boost/graph/use_mpi.hpp> 
#include <boost/graph/adjacency_list.hpp> 
#include <boost/graph/distributed/dehne_gotz_min_spanning_tree.hpp> 
#include <boost/graph/incremental_components.hpp> 
#include <iostream> 
#include <pqxx/except.hxx> 
#include <pqxx/transaction_base.hxx> 
#include <set> 
#include <map> 
#include <string> 

using std::string; 
using std::set; 
using std::map; 
using namespace pqxx; 

struct foreign_key_relationship{ 
    string parent_table; 
    string parent_column; 
    string child_table; 
    string child_column; 

    foreign_key_relationship(){} 

    foreign_key_relationship(string pt, string pc, string ct, string cc) : parent_table(pt), parent_column(pc), child_table(ct), child_column(cc) {} 

}; 

inline bool operator==(const foreign_key_relationship& lhs, const foreign_key_relationship& rhs) 
{ 
    return 
     lhs.parent_table == rhs.parent_table 
     && lhs.parent_column == rhs.parent_column 
     && lhs.child_table == rhs.child_table 
     && lhs.child_column == rhs.child_column 
    ; 
} 

inline bool operator<(const foreign_key_relationship& lhs, const foreign_key_relationship& rhs) 
{ 
    return 
     lhs.parent_table < rhs.parent_table 
     && lhs.parent_column < rhs.parent_column 
     && lhs.child_table < rhs.child_table 
     && lhs.child_column < rhs.child_column 
    ; 
} 

typedef boost::adjacency_list < boost::vecS, boost::vecS, boost::undirectedS, string, foreign_key_relationship > relational_graph; 
typedef boost::graph_traits<relational_graph>::vertex_descriptor relational_vertex; 
typedef boost::graph_traits<relational_graph>::vertices_size_type relational_vertex_index; 
typedef boost::graph_traits<relational_graph>::edge_descriptor relational_edge; 
typedef relational_vertex_index* relational_rank; 
typedef relational_vertex* relational_parent; 

void libpqxx_error(const pqxx_exception &e){ 
    std::cerr << "*** Caught pqxx_exception:\n"; 
    std::cerr << e.base().what() << "\n"; 
    const sql_error *s=dynamic_cast<const sql_error*>(&e.base()); 
    if (s) std::cerr << "Query was: " << s->query() << "\n"; 
} 

void connect_relational_vertices(map< foreign_key_relationship, relational_edge > &table_edges, result &foreign_keys, set<string> &tables_to_connect, map< string, relational_vertex > &table_vertices, relational_graph &rg, boost::disjoint_sets<relational_rank, relational_parent> &ds){ 
    for(unsigned i=0; i<foreign_keys.size(); i++){ 
     foreign_key_relationship this_relationship(
      foreign_keys[i]["parent_table"].c_str(), 
      foreign_keys[i]["parent_column"].c_str(), 
      foreign_keys[i]["child_table"].c_str(), 
      foreign_keys[i]["child_column"].c_str() 
     ); 
     if(!table_edges.count(this_relationship) && tables_to_connect.count(foreign_keys[i]["parent_table"].c_str()) && tables_to_connect.count(foreign_keys[i]["child_table"].c_str())){ 
      table_edges[ this_relationship ] = boost::add_edge(
       table_vertices[ string(foreign_keys[i]["parent_table"].c_str()) ], 
       table_vertices[ string(foreign_keys[i]["child_table"].c_str()) ], 
       this_relationship, 
       rg 
      ).first; 
      ds.union_set(table_vertices[ string(foreign_keys[i]["parent_table"].c_str()) ], table_vertices[ string(foreign_keys[i]["child_table"].c_str()) ]); 
     } 
    } 
} 

void add_possible_linking_vertex(result &foreign_keys, map< string, relational_vertex > &table_vertices, relational_graph &rg){ 
    for(unsigned i=0; i<foreign_keys.size(); i++){ 
     if(!table_vertices.count(foreign_keys[i]["parent_table"].c_str())){ 
      table_vertices[ foreign_keys[i]["parent_table"].c_str() ] = boost::add_vertex(foreign_keys[i]["parent_table"].c_str(), rg); 
      break; 
     } 
     if(foreign_keys[i]["child_table"].c_str()){ 
      table_vertices[ foreign_keys[i]["child_table"].c_str() ] = boost::add_vertex(foreign_keys[i]["child_table"].c_str(), rg); 
      break; 
     } 
    } 
}  

set<foreign_key_relationship> get_foreign_keys(transaction_base &t, set<string> tables_to_connect){ 
    try{ 
     result foreign_keys = t.prepared("get_foreign_keys").exec(); 

     set<foreign_key_relationship> relational_routes; 

     if(tables_to_connect.size()){ 

      relational_graph rg; 

      map< string, relational_vertex > table_vertices; 
      for(string table: tables_to_connect) 
       table_vertices[ table ] = boost::add_vertex(table, rg); 

      std::vector<relational_vertex_index> rank(num_vertices(rg)); 
      std::vector<relational_vertex> parent(num_vertices(rg)); 

      boost::disjoint_sets<relational_rank, relational_parent> ds(&rank[0], &parent[0]); 

      boost::initialize_incremental_components(rg, ds); 
      boost::incremental_components(rg, ds); 

      map< foreign_key_relationship, relational_edge > table_edges; 
      for(unsigned i=0; i<foreign_keys.size(); i++) 
       connect_relational_vertices(table_edges, foreign_keys, tables_to_connect, table_vertices, rg, ds); 

     } 

     return relational_routes; 
    } 
    catch(const pqxx_exception &e){ 
     libpqxx_error(e); 
     set<foreign_key_relationship> relational_routes; 
     return relational_routes; 
    } 
} 

int main() 
{ 
    relational_graph rg; 
    map<foreign_key_relationship, relational_edge> table_edges; 
    pqxx::result data; 
    set<string> tables { "foo", "bar" }; 
    map<string, relational_vertex> table_vertices; 
    boost::disjoint_sets<relational_rank, relational_parent> ds(relational_rank{}, relational_parent{}); 

    connect_relational_vertices(table_edges, data, tables, table_vertices, rg, ds); 
} 

나는

  • GCC 4.8, 4.9로 컴파일 3.5-1
  • 부스트 1_56_0
  • 명령 줄 연타 :

    그램 ++ -std = C + +0 - 벽 - 페달 틱 -lpthread -g -O0- 시스템 ~/custom/boost/-isystem/usr/include/mpi test.cpp -o 테스트 -lmpich -lpqxx