我正在使用Boost Graph Library并在此基础上构建我自己的类。
现在,我有以下功能:
template< class VERTEXPROPERTIES >
VERTEXPROPERTIES& properties(const Vertex& v) const
{
typename property_map<FilteredGraphContainer, vertex_properties_t>::const_type param = get(vertex_properties, graph_);
return param[v];
}
当我在这样的类模板中使用此函数时:
template< class VERTEXPROPERTIES, class EDGEPROPERTIES >
class Graph
{
// all the code
};
它有效。 但是,当我想在类这样的类中使用它时:
template < class GRAPH, class EDGE_PREDICATE, class VERTEX_PREDICATE >
class FilteredGraph
{
// all the code
};
并将properties()函数应用于FilteredGraph对象,编译器抱怨它无法找到该函数。
据我所知,到目前为止,这可能是由于参数列表中缺少模板参数
对于Graph-class,这个模板参数很容易找到,因为它在创建Graph-object时被定义
但对于FilteredGraph,它应该能够从GRAPH-template参数中推断出它
然后,我认为编译器在获取正确的返回值类型时会遇到问题,因为事先可能需要这样做才能找到...
我真的希望将这个概念与properties()函数保持一致,因为它允许保持其他函数的通用性
您对如何解决该问题有任何想法,可能保留这个概念吗?
答案 0 :(得分:0)
再次,我对没有提供更多信息表示歉意 在我看来,编译器无法在那里推断出依赖类型。在使用模板之前,我曾经遇到过这个问题 我会在这里提供修复,以防有人遇到类似的问题。
FilteredGraph使用Graph的实例(基本上是带有内部自定义属性的adjacency_list)作为输入。 Graph-class有两个模板参数,一个用于顶点的属性,另一个用于边的属性
作为一个小小的注释,使用捆绑属性(不受旧版本的boost图库支持,也不受某些编译器支持),我认为,这个问题可以被规避,因为你不需要额外的函数返回一个值(可能)未知类型。
因为需要为某些特定类型的顶点/边缘属性指定传递给FilteredGraph的Graph对象,所以实际上可以提取此信息。
我通过以下方式实现了这一目标:
/// Type of the internal properties of the edges
typedef typename property_traits< typename property_map<FilteredGraphContainer, vertex_properties_t>::type >::value_type VProps;
/// Type of the internal properties of the edges
typedef typename property_traits< typename property_map<FilteredGraphContainer, edge_properties_t>::type >::value_type EProps;
然后定义:
VProps& properties(const Vertex& v)
{
typename property_map<FilteredGraphContainer, vertex_properties_t>::type param = get(vertex_properties, graph_);
return (param[v]);
}
再次感谢您对此问题的关注,我很抱歉没有提供更多信息。
最好的问候。