Я использую библиотеку графов ускорения и на этом строю свои собственные классы.
Теперь у меня есть следующая функция:
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 этот параметр шаблона легко найти, так как он определяется при создании объекта Graph.
Но для FilteredGraph он должен быть в состоянии вывести его из параметра GRAPH-template.
С другой стороны, я думаю, что у компилятора, тем не менее, будут проблемы с получением правильного типа возвращаемого значения, поскольку это, вероятно, может потребоваться выяснить заранее ...
Мне бы очень хотелось сохранить эту концепцию с помощью функции properties (), поскольку она позволяет сделать другие функции общими.
У вас есть идеи, как решить эту проблему, возможно, сохранив концепцию?