
Hi all, I'm trying to compile the following code and have some compiler errors (MSVC 8). // TestBoostGraph1.cpp : Defines the entry point for the console application. // #include "stdafx.h" #include <string> #include <boost/graph/adjacency_list.hpp> #include <boost/graph/adjacency_matrix.hpp> #include <boost/graph/graphviz.hpp> #include <boost/graph/iteration_macros.hpp> #include <boost/graph/graph_utility.hpp> #include <boost/graph/copy.hpp> ///Just for read "work around" ///Two typedefs for modeling both "discrete" & "continues" nets typedef int discret_net_t; typedef double continues_net_t; /// typedef enum {PLACE, TRANSITION} node_type_t; /*! * If you need some more properties, then you should define your property class that derived from * basic_vertex_properties<>; - for nodes, * basic_edge_properties<>; - for edges * Example: struct my_node_prop : basic_vertex_properties<discret_net_t> { typedef double node_delay_t; node_delay_t m_node_delay; }; typedef CPetriNet<adj_list, boost::vecS, boost::listS, boost::bidirectionalS, my_node_prop> petri_net_t * * The types of all property values must be Copy Constructible, Assignable and Default Constructible!! */ template <class T = discret_net_t> struct basic_vertex_properties { typedef std::string node_name_type; typedef int node_index_t; basic_vertex_properties(node_type_t nt = TRANSITION) : m_node_type(nt) { m_token_number = T(0);} T m_token_number; ///Only for place, possible costruct "continues" nets node_name_type m_node_name; node_type_t m_node_type; ///Vertex could be "Place" or "transition" node_index_t m_node_index;///Internal property for convenient vertices lookup }; ///Basic properties for edge template <class T = discret_net_t> struct basic_edge_properties { typedef int edge_index_t; basic_edge_properties(T ew = 0) : m_weight(ew) {} T m_weight; ///possible construct "continues" nets edge_index_t m_edge_index; ///Internal property for convenient vertices lookup; }; using boost::bidirectionalS; using boost::directedS; using boost::no_property; struct my_ver_p : public basic_vertex_properties<discret_net_t> { double m_node_delay; }; struct my_edge_p : public basic_edge_properties<discret_net_t> { double m_edge_delay; }; int _tmain(int argc, _TCHAR* argv[]) { typedef boost::adjacency_list<boost::listS, boost::listS, directedS, my_ver_p> adj_list1_t; adj_list1_t c(10); boost::property_map<adj_list1_t, my_ver_p::node_name_type my_ver_p::* >::type node_name_map1(boost::get(&my_ver_p::m_node_name, c)); boost::print_graph(c, node_name_map1) ; return 0; } 1>------ Build started: Project: TestBoostGraph1, Configuration: Debug Win32 ------ 1>Compiling... 1>TestBoostGraph1.cpp 1>d:\documents and settings\dmitry\my documents\visual studio 2005\projects\testboostgraph1\testboostgraph1\testboostgraph1.cpp(78) : error C2664: 'boost::bundle_property_map<Graph,Descriptor,Bundle,T>::bundle_property_map(const boost::bundle_property_map<Graph,Descriptor,Bundle,T> &)' : cannot convert parameter 1 from 'boost::bundle_property_map<Graph,Descriptor,Bundle,T>' to 'const boost::bundle_property_map<Graph,Descriptor,Bundle,T> &' 1> with 1> [ 1> Graph=adj_list1_t, 1> Descriptor=void *, 1> Bundle=my_ver_p, 1> T=basic_vertex_properties<discret_net_t>::node_name_type 1> ] 1> and 1> [ 1> Graph=boost::adjacency_list<boost::listS,boost::listS,boost::directedS,my_ver_p>, 1> Descriptor=boost::detail::edge_desc_impl<boost::directed_tag,void *>, 1> Bundle=basic_vertex_properties<discret_net_t>, 1> T=basic_vertex_properties<discret_net_t>::node_name_type 1> ] 1> and 1> [ 1> Graph=adj_list1_t, 1> Descriptor=void *, 1> Bundle=my_ver_p, 1> T=basic_vertex_properties<discret_net_t>::node_name_type 1> ] 1> Reason: cannot convert from 'boost::bundle_property_map<Graph,Descriptor,Bundle,T>' to 'const boost::bundle_property_map<Graph,Descriptor,Bundle,T>' 1> with 1> [ 1> Graph=boost::adjacency_list<boost::listS,boost::listS,boost::directedS,my_ver_p>, 1> Descriptor=boost::detail::edge_desc_impl<boost::directed_tag,void *>, 1> Bundle=basic_vertex_properties<discret_net_t>, 1> T=basic_vertex_properties<discret_net_t>::node_name_type 1> ] 1> and 1> [ 1> Graph=adj_list1_t, 1> Descriptor=void *, 1> Bundle=my_ver_p, 1> T=basic_vertex_properties<discret_net_t>::node_name_type 1> ] 1> No user-defined-conversion operator available that can perform this conversion, or the operator cannot be called 1>TestBoostGraph1 - 1 error(s), 0 warning(s) ========== Build: 0 succeeded, 1 failed, 0 up-to-date, 0 skipped ========== if change graph representation to following typedef boost::adjacency_list<boost::listS, boost::listS, directedS, basic_vertex_properties<> > adj_list1_t; then this compiles without any error: adj_list1_t c(10); boost::property_map<adj_list1_t, basic_vertex_properties<>::node_name_type basic_vertex_properties<>::*
::type
node_name_map1(boost::get(&basic_vertex_properties<>::m_node_name, c)); but with this I again have some error (just change "type" to "const_type" adj_list1_t c(10); boost::property_map<adj_list1_t, basic_vertex_properties<>::node_name_type basic_vertex_properties<>::*
::const_type
node_name_map1(boost::get(&basic_vertex_properties<>::m_node_name, c)); 1>------ Build started: Project: TestBoostGraph1, Configuration: Debug Win32 ------ 1>Compiling... 1>TestBoostGraph1.cpp 1>d:\documents and settings\dmitry\my documents\visual studio 2005\projects\testboostgraph1\testboostgraph1\testboostgraph1.cpp(79) : error C2664: 'boost::bundle_property_map<Graph,Descriptor,Bundle,T>::bundle_property_map(const boost::bundle_property_map<Graph,Descriptor,Bundle,T> &)' : cannot convert parameter 1 from 'boost::bundle_property_map<Graph,Descriptor,Bundle,T>' to 'const boost::bundle_property_map<Graph,Descriptor,Bundle,T> &' 1> with 1> [ 1> Graph=const adj_list1_t, 1> Descriptor=void *, 1> Bundle=basic_vertex_properties<discret_net_t>, 1> T=const basic_vertex_properties<discret_net_t>::node_name_type 1> ] 1> and 1> [ 1> Graph=adj_list1_t, 1> Descriptor=void *, 1> Bundle=basic_vertex_properties<discret_net_t>, 1> T=basic_vertex_properties<discret_net_t>::node_name_type 1> ] 1> and 1> [ 1> Graph=const adj_list1_t, 1> Descriptor=void *, 1> Bundle=basic_vertex_properties<discret_net_t>, 1> T=const basic_vertex_properties<discret_net_t>::node_name_type 1> ] 1> Reason: cannot convert from 'boost::bundle_property_map<Graph,Descriptor,Bundle,T>' to 'const boost::bundle_property_map<Graph,Descriptor,Bundle,T>' 1> with 1> [ 1> Graph=adj_list1_t, 1> Descriptor=void *, 1> Bundle=basic_vertex_properties<discret_net_t>, 1> T=basic_vertex_properties<discret_net_t>::node_name_type 1> ] 1> and 1> [ 1> Graph=const adj_list1_t, 1> Descriptor=void *, 1> Bundle=basic_vertex_properties<discret_net_t>, 1> T=const basic_vertex_properties<discret_net_t>::node_name_type 1> ] 1> No user-defined-conversion operator available that can perform this conversion, or the operator cannot be called 1>TestBoostGraph1 - 1 error(s), 0 warning(s) ========== Build: 0 succeeded, 1 failed, 0 up-to-date, 0 skipped ========== What is wrong here? Any help would be greatly appreciated, Thanks in advance, --dima // TestBoostGraph1.cpp : Defines the entry point for the console application. // #include "stdafx.h" #include <string> #include <boost/graph/adjacency_list.hpp> #include <boost/graph/adjacency_matrix.hpp> #include <boost/graph/graphviz.hpp> #include <boost/graph/iteration_macros.hpp> #include <boost/graph/graph_utility.hpp> #include <boost/graph/copy.hpp> ///Just for read "work around" ///Two typedefs for modeling both "discrete" & "continues" nets typedef int discret_net_t; typedef double continues_net_t; /// typedef enum {PLACE, TRANSITION} node_type_t; /*! * If you need some more properties, then you should define your property class that derived from * basic_vertex_properties<>; - for nodes, * basic_edge_properties<>; - for edges * Example: struct my_node_prop : basic_vertex_properties<discret_net_t> { typedef double node_delay_t; node_delay_t m_node_delay; }; typedef CPetriNet<adj_list, boost::vecS, boost::listS, boost::bidirectionalS, my_node_prop> petri_net_t * * The types of all property values must be Copy Constructible, Assignable and Default Constructible!! */ template <class T = discret_net_t> struct basic_vertex_properties { //typedef node_type_t my_node_type; typedef std::string node_name_type; typedef int node_index_t; basic_vertex_properties(node_type_t nt = TRANSITION) : m_node_type(nt) { m_token_number = T(0);} T m_token_number; ///Only for place, possible costruct "continues" nets node_name_type m_node_name; node_type_t m_node_type; ///Vertex could be "Place" or "transition" node_index_t m_node_index;///Internal property for convenient vertices lookup }; ///Basic properties for edge template <class T = discret_net_t> struct basic_edge_properties { typedef int edge_index_t; basic_edge_properties(T ew = 0) : m_weight(ew) {} //private: T m_weight; ///possible construct "continues" nets edge_index_t m_edge_index; ///Internal property for convenient vertices lookup; }; using boost::bidirectionalS; using boost::directedS; using boost::no_property; struct my_ver_p : public basic_vertex_properties<discret_net_t> { double m_node_delay; }; struct my_edge_p : public basic_edge_properties<discret_net_t> { double m_edge_delay; }; int _tmain(int argc, _TCHAR* argv[]) { //typedef boost::adjacency_list<boost::listS, boost::listS, directedS, my_ver_p> adj_list1_t; typedef boost::adjacency_list<boost::listS, boost::listS, directedS, basic_vertex_properties<> > adj_list1_t; adj_list1_t c(10); boost::property_map<adj_list1_t, basic_vertex_properties<>::node_name_type basic_vertex_properties<>::* >::const_type node_name_map1(boost::get(&basic_vertex_properties<>::m_node_name, c)); boost::print_graph(c, node_name_map1) ; return 0; }