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;
}