Boost logo

Boost Users :

From: Welson Sun (welson_sun_at_[hidden])
Date: 2005-02-11 18:00:49


Now another question arises:

The vertex property writer is working, but if I add the edge property
writer, it compiles error again:

$ g++ main.cpp
/usr/local/include/boost/graph/graphviz.hpp: In function `void
   boost::write_graphviz(std::ostream&, const Graph&,
VertexPropertiesWriter,
   EdgePropertiesWriter, GraphPropertiesWriter) [with Graph =
   boost::adjacency_list<boost::vecS, boost::vecS, boost::bidirectionalS,
   BasicOperator, boost::no_property, boost::no_property, boost::listS>,
   VertexPropertiesWriter =
   schedule_vertex_writer<boost::adjacency_list<boost::vecS, boost::vecS,
   boost::bidirectionalS, BasicOperator, boost::no_property,
   boost::no_property, boost::listS> >, EdgePropertiesWriter =
   schedule_edge_writer<boost::adjacency_list<boost::vecS, boost::vecS,
   boost::bidirectionalS, BasicOperator, boost::no_property,
   boost::no_property, boost::listS> >, GraphPropertiesWriter =
   boost::default_writer]':
/usr/local/include/boost/graph/graphviz.hpp:300: instantiated from `void
boos
::write_graphviz(std::ostream&, const Graph&, VertexWriter, EdgeWriter)
[with G
aph = Graph, VertexWriter =
schedule_vertex_writer<boost::adjacency_list<boost:
vecS, boost::vecS, boost::bidirectionalS, BasicOperator, boost::no_property,
bo
st::no_property, boost::listS> >, EdgeWriter =
schedule_edge_writer<boost::adja
ency_list<boost::vecS, boost::vecS, boost::bidirectionalS, BasicOperator,
boost
:no_property, boost::no_property, boost::listS> >]'
main.cpp:51: instantiated from here
/usr/local/include/boost/graph/graphviz.hpp:270: error: no match for call to
`(
   schedule_edge_writer<boost::adjacency_list<boost::vecS, boost::vecS,
   boost::bidirectionalS, BasicOperator, boost::no_property,
   boost::no_property, boost::listS> >) (std::basic_ostream<char,
   std::char_traits<char> >&,
   boost::detail::edge_desc_impl<boost::bidirectional_tag, size_t>)'
helper.hpp:73: error: candidates are: void
   schedule_edge_writer<Graph>::operator()(std::ostream&, Edge&) [with Edge
=
   boost::detail::edge_desc_impl<boost::bidirectional_tag, size_t>, Graph =
   boost::adjacency_list<boost::vecS, boost::vecS, boost::bidirectionalS,
   BasicOperator, boost::no_property, boost::no_property, boost::listS>]

I use the same pattern for vertex property writer and edge property writer,
here is the code snapshot:
//Class template of a vertex property writer
template < typename Graph >
class schedule_vertex_writer {
public:
  schedule_vertex_writer(Graph _g) : g(_g) {}
                       
  template <typename Vertex>
  void operator()(std::ostream& out, Vertex& v) {
    out << "[label=\""
        << g[v].toString()
        << "\"]";
  }
private:
  Graph& g;
};

//Function template to return an object of the above class
template <typename Graph>
inline schedule_vertex_writer<Graph>
make_schedule_vertex_writer(Graph g){
  return schedule_vertex_writer<Graph>(g);
}

//Class template of an edge property writer
template < typename Graph >
class schedule_edge_writer {
public:
  schedule_edge_writer(Graph _g) : g(_g) {}
                       
  template <typename Edge>
  void operator()(std::ostream& out, Edge& v) {
    out << "[label=\""
        << "E"
        << "\"]";
  }
private:
  Graph& g;
};

//Function template to return an object of the above class
template <typename Graph>
inline schedule_edge_writer<Graph>
make_schedule_edge_writer(Graph g){
  return schedule_edge_writer<Graph>(g);
}
 

-----Original Message-----
From: boost-users-bounces_at_[hidden]
[mailto:boost-users-bounces_at_[hidden]] On Behalf Of Welson Sun
Sent: Friday, February 11, 2005 3:19 PM
To: boost-users_at_[hidden]
Subject: RE: [Boost-users] BGL problem,originally [Another
C++inheritence/polymorphism problem]

Yeah, if I change the vertex property writer to be:

  void operator()(std::ostream& out, Vertex& v)

It works fine.

-----Original Message-----
From: boost-users-bounces_at_[hidden]
[mailto:boost-users-bounces_at_[hidden]] On Behalf Of Douglas Gregor
Sent: Friday, February 11, 2005 6:23 AM
To: boost-users_at_[hidden]
Subject: Re: [Boost-users] BGL problem,originally [Another C++
inheritence/polymorphism problem]

On Feb 10, 2005, at 10:25 PM, Welson Sun wrote:

>
> Well, I found out that this is not a problem related to inheritence
> nor polymorphism, it is a problem with the BGL
>
> 1. Even if I make BasicOperator not inherit from Operator, the problem
> is the same.
> Here is the modified BasicOperator:
>
> class BasicOperator /* : public Operator */{
> public:
> BasicOperator() {};
> BasicOperator(OperatorType* type) : _type(type) {toString =
> _type->getMnemonic();};
> BasicOperator(OperatorType* type, string cust) : _type(type),
> _cust(cust)
> {toString = _type->getMnemonic() + "&" + _cust;};
> OperatorType* getOperatorType() { return _type; }
> string toString() { return toString; }
> string toString;
> private:
> OperatorType* _type;
> string _cust;
> };
>
> And the vertex property writer is:
> void operator()(std::ostream& out, const Vertex& v) const {
> out << "[label=\""
> << "(" << g[v].toString() << ")"
> << "\"]";
> }
>
> The error is:
> main.cpp:52: error: passing `const BasicOperator' as `this' argument
> of `
> std::string BasicOperator::toString()' discards qualifiers

Looking at the code you previously posted and mapping that to what you've
written here, here's what happens:

schedule_vertex_writer stores a _copy_ of the graph (called g) inside it.
Since operator() is marked "const", g[v] returns a reference to a const
BasicOperator. But, when you call toString(), it is not marked const, so you
get the error above.

I have two suggestions:
   (1) Pass and store the graph g as a "const Graph&" in
schedule_vertex_writer. Copying graphs can be really expensive.
   (2) Make toString() const. If you absolutely cannot do this, then you'll
need to store a non-const reference to the graph instead of a const one.

> So it looks like that the problem is related to the "const"
> BasicOperator I
> passed into std::string BasicOperator::toString(). How can I fix this?
> Which
> means if the property of a vertex is a Class, how can I call its
> member function in the vertex writer?
>
> 2. If I changes the vertex property writer as:
> void operator()(std::ostream& out, const Vertex& v) const {
> out << "[label=\""
> << "(" << g[v].toString << ")"
> << "\"]";
> }
> Everything is OK. Which mean in the vertex property writer, I can
> access the data member without any problem, but I cannot access the
> member function.

Right, because data members can be accessed irrespective of the
cv-qualifiers on the object type. You'll just get a const std::string& back.

        Doug

_______________________________________________
Boost-users mailing list
Boost-users_at_[hidden]
http://lists.boost.org/mailman/listinfo.cgi/boost-users

_______________________________________________
Boost-users mailing list
Boost-users_at_[hidden]
http://lists.boost.org/mailman/listinfo.cgi/boost-users


Boost-users list run by williamkempf at hotmail.com, kalb at libertysoft.com, bjorn.karlsson at readsoft.com, gregod at cs.rpi.edu, wekempf at cox.net