|
Boost Users : |
From: Tony Cook (tony__cook_at_[hidden])
Date: 2005-09-09 10:37:02
Hello,
Can anyone tell me if I've exposed a bug in the Boost Graph Library or if
the following behaviour is expected and I need to code the solution in a
different way, and if so HOW?
In summary the boost::copy_graph algorithm fails to compile when defining
the graph using std::vector for the edge container and std::list for the
vertex container (Visual Studio 7.1, Boost 1.32.0). Other graph type
definitions work. (NB I can't use the "working" graph types in my main
application as VC 7.1 bombs with an Internal Compiler Error. I'm forced to
use a vecS,lists graph just to work round the ICE problem!!).
I've distilled the problem down to the minimum code possible.
-------------------------------------------------
// A vecS, vecS based graph works
typedef boost::adjacency_list
<boost::vecS,
boost::vecS,
boost::undirectedS,
boost::no_property,
boost::no_property,
boost::no_property> GoodGraphType ;
GoodGraphType good_graph_1 ;
GoodGraphType good_graph_2 ;
boost::copy_graph (good_graph_1, good_graph_2) ; // Compiles OK
-------------------------------------------------
// A listS, vecS based graph also works
typedef boost::adjacency_list
<boost::listS,
boost::vecS,
boost::undirectedS,
boost::no_property,
boost::no_property,
boost::no_property> AnotherGoodGraphType ;
AnotherGoodGraphType another_good_graph_1 ;
AnotherGoodGraphType another_good_graph_2 ;
boost::copy_graph (another_good_graph_1, another_good_graph_2) ; //
Compiles OK
-------------------------------------------------
// A vecS, lists based graph fails to compile - BGL error or expected??
typedef boost::adjacency_list
<boost::vecS,
boost::listS, // root cause of
compilation failure
boost::undirectedS,
boost::no_property,
boost::no_property,
boost::no_property> BadGraphType ;
BadGraphType bad_graph_1 ;
BadGraphType bad_graph_2 ;
boost::copy_graph (bad_graph_1, bad_graph_2) ; // ***** Does not compile
******
-------------------------------------------------------
Here is the exact wording of the VC7.1 compiler output.
-------------------------------------------------------
..\boost_1_32_0\boost\property_map.hpp(349) : error C2678: binary '+' : no
operator found which takes a left-hand operand of type 'const
std::vector<_Ty>::iterator' (or there is no acceptable conversion)
with
[
_Ty=boost::detail::adj_list_gen<boost::adjacency_list<boost::vecS,boost::vec
S,boost::undirectedS,boost::no_property,boost::no_property,boost::no_propert
y>,boost::vecS,boost::vecS,boost::undirectedS,boost::detail::retag_property_
list<boost::vertex_bundle_t,boost::no_property>::type,boost::detail::retag_p
roperty_list<boost::edge_bundle_t,boost::no_property>::type,boost::no_proper
ty,boost::listS>::config::vertex_ptr
]
...\boost_1_32_0\boost\property_map.hpp(349) : while compiling
class-template member function 'void
boost::iterator_property_map<RandomAccessIterator,IndexMap,T,R>::operator
[](boost::iterator_property_map<RandomAccessIterator,IndexMap,T,R>::key_type
) const'
with
[
RandomAccessIterator=std::vector<boost::detail::adj_list_gen<boost::adjacenc
y_list<boost::vecS,boost::vecS,boost::undirectedS,boost::no_property,boost::
no_property,boost::no_property>,boost::vecS,boost::vecS,boost::undirectedS,b
oost::detail::retag_property_list<boost::vertex_bundle_t,boost::no_property>
::type,boost::detail::retag_property_list<boost::edge_bundle_t,boost::no_pro
perty>::type,boost::no_property,boost::listS>::config::vertex_ptr
>::iterator,
IndexMap=boost::property_map<boost::adjacency_list<boost::vecS,boost::listS,
boost::undirectedS,boost::no_property,boost::no_property,boost::no_property>
,boost::vertex_index_t>::const_type,
T=std::allocator<boost::detail::adj_list_gen<boost::adjacency_list<boost::ve
cS,boost::vecS,boost::undirectedS,boost::no_property,boost::no_property,boos
t::no_property>,boost::vecS,boost::vecS,boost::undirectedS,boost::detail::re
tag_property_list<boost::vertex_bundle_t,boost::no_property>::type,boost::de
tail::retag_property_list<boost::edge_bundle_t,boost::no_property>::type,boo
st::no_property,boost::listS>::config::vertex_ptr >::value_type,
R=std::allocator<boost::detail::adj_list_gen<boost::adjacency_list<boost::ve
cS,boost::vecS,boost::undirectedS,boost::no_property,boost::no_property,boos
t::no_property>,boost::vecS,boost::vecS,boost::undirectedS,boost::detail::re
tag_property_list<boost::vertex_bundle_t,boost::no_property>::type,boost::de
tail::retag_property_list<boost::edge_bundle_t,boost::no_property>::type,boo
st::no_property,boost::listS>::config::vertex_ptr >::value_type &
]
...\boost_1_32_0\boost\graph\copy.hpp(323) : see reference to class
template instantiation
'boost::iterator_property_map<RandomAccessIterator,IndexMap,T,R>' being
compiled
with
[
RandomAccessIterator=std::vector<boost::detail::adj_list_gen<boost::adjacenc
y_list<boost::vecS,boost::vecS,boost::undirectedS,boost::no_property,boost::
no_property,boost::no_property>,boost::vecS,boost::vecS,boost::undirectedS,b
oost::detail::retag_property_list<boost::vertex_bundle_t,boost::no_property>
::type,boost::detail::retag_property_list<boost::edge_bundle_t,boost::no_pro
perty>::type,boost::no_property,boost::listS>::config::vertex_ptr
>::iterator,
IndexMap=boost::property_map<boost::adjacency_list<boost::vecS,boost::listS,
boost::undirectedS,boost::no_property,boost::no_property,boost::no_property>
,boost::vertex_index_t>::const_type,
T=std::allocator<boost::detail::adj_list_gen<boost::adjacency_list<boost::ve
cS,boost::vecS,boost::undirectedS,boost::no_property,boost::no_property,boos
t::no_property>,boost::vecS,boost::vecS,boost::undirectedS,boost::detail::re
tag_property_list<boost::vertex_bundle_t,boost::no_property>::type,boost::de
tail::retag_property_list<boost::edge_bundle_t,boost::no_property>::type,boo
st::no_property,boost::listS>::config::vertex_ptr >::value_type,
R=std::allocator<boost::detail::adj_list_gen<boost::adjacency_list<boost::ve
cS,boost::vecS,boost::undirectedS,boost::no_property,boost::no_property,boos
t::no_property>,boost::vecS,boost::vecS,boost::undirectedS,boost::detail::re
tag_property_list<boost::vertex_bundle_t,boost::no_property>::type,boost::de
tail::retag_property_list<boost::edge_bundle_t,boost::no_property>::type,boo
st::no_property,boost::listS>::config::vertex_ptr >::value_type &
]
...\CopyGraphTest.cpp(50) : see reference to function template
instantiation 'void boost::copy_graph<BadGraphType,BadGraphType>(const
VertexListGraph &,MutableGraph &)' being compiled
with
[
VertexListGraph=BadGraphType,
MutableGraph=BadGraphType
]
-------------------------------------------------------
Here is the code from property_map.hpp the generates the error - error line
marked with //<----- HERE
//=========================================================================
// Adapter to turn a RandomAccessIterator into a property map
template <class RandomAccessIterator,
class IndexMap
#ifdef BOOST_NO_STD_ITERATOR_TRAITS
, class T, class R
#else
, class T = typename
std::iterator_traits<RandomAccessIterator>::value_type
, class R = typename
std::iterator_traits<RandomAccessIterator>::reference
#endif
>
class iterator_property_map
: public boost::put_get_helper< R,
iterator_property_map<RandomAccessIterator, IndexMap,
T, R> >
{
public:
typedef typename property_traits<IndexMap>::key_type key_type;
typedef T value_type;
typedef R reference;
typedef boost::lvalue_property_map_tag category;
inline iterator_property_map(
RandomAccessIterator cc = RandomAccessIterator(),
const IndexMap& _id = IndexMap() )
: iter(cc), index(_id) { }
inline R operator[](key_type v) const { return *(iter + get(index, v)) ;
} //<----- HERE
protected:
RandomAccessIterator iter;
IndexMap index;
};
--------------------------------------------------------
TIA for any help in this matter
Tony Cook
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