Hi Maurizio,
On Mon, Oct 7, 2013 at 7:04 PM, Maurizio Vitale wrote:
In some dark corner of it, the following was compiling fine:
struct InstancePropertyTag {
typedef boost::vertex_property_tag kind;
};
under 1.54, I get 'attempt to form reference to void', but everything was
fine under 1.46.
Does somebody know if some properties were added by default to graphs
before and need to be explicitly added now?
The internal details of the property implementation have changed quite a
bit between version 1.46 and 1.54. I got taken by a similar problem some
time ago, and I learned my lesson: Do not rely on the internal details. If
things are not documented (i.e., part of the well-defined interface), then
you should not rely on it or expect it to remain the same.
If you look at the current definition of the BOOST_INSTALL_PROPERTY macro,
you see this:
#define BOOST_INSTALL_PROPERTY(KIND, NAME) \
template <> struct property_kind { \
typedef KIND##_property_tag type; \
}
Meaning that you're property-tag should be defined as a partial
specialization of the property_kind template. It used to be that the "kind"
of the tag was obtained through a straight-forward traits mechanism that
just fetched the "kind" nested type within your property-tag class. Now,
they added a few layers to that to accommodate "special" tags like
"vertex_all_t" or "vertex_bundled_t". The way you defined your custom
property-tag may have worked in the old system, but apparently it does not
work anymore.
The documentation tells you that you should just use the
BOOST_DEF_PROPERTY macro
for defining new property-tags. That's what you should do. Trying to use
the internals directly is not a good idea for portability, because the
library implementers cannot be expected to maintain the internals, only the
user-facing functionality.
So, you should do:
namespace boost {
BOOST_DEF_PROPERTY(vertex, instance_property)
};
typedef boost::vertex_instance_property_t InstancePropertyTag;
I hope this solves your problem,
Sven Mikael Persson