marci@315: // -*- c++ -*- marci@315: //compile it with marci@315: //g++ -ansi -pedantic marci@315: //and with marci@315: //g++ marci@315: //I did with g++ ver 3.0.4, suse 8.0 marci@315: //If the template is removed from NodeMap, then it works well. marci@315: //athos@cs.elte.hu marci@315: //klao@cs.elte.hu marci@315: //marci@cs.elte.hu marci@315: marci@315: class ListGraph { marci@315: public: marci@315: ListGraph() { } marci@315: marci@315: template <typename T> class NodeMap { marci@315: const ListGraph& G; marci@315: public: marci@315: NodeMap(const ListGraph& _G) : G(_G) { } marci@315: }; marci@315: marci@315: }; marci@315: marci@315: template<typename Graph> class GraphWrapper { marci@315: protected: marci@315: Graph* graph; marci@315: public: marci@315: GraphWrapper(Graph& _graph) : graph(&_graph) { } marci@315: klao@383: template<typename T> class NodeMap : public Graph::template NodeMap<T> { klao@383: typedef typename Graph::template NodeMap<T> Parent; marci@315: public: marci@315: NodeMap(const GraphWrapper<Graph>& _G) : klao@383: Parent(*(_G.graph)) { } marci@315: }; marci@315: }; marci@315: marci@315: template<typename Graph> marci@315: class ResGraphWrapper : public GraphWrapper<Graph> { marci@315: public: marci@315: ResGraphWrapper(Graph& _graph) : GraphWrapper<Graph>(_graph) { } marci@315: }; marci@315: marci@315: template <typename Graph> class MaxFlow { marci@315: const Graph* g; marci@315: typedef ResGraphWrapper<const Graph> ResGW; marci@315: public: marci@315: MaxFlow(const Graph& _g) : g(&_g) { } marci@315: void augmentOnShortestPath() { marci@315: ResGW res_graph(*g); klao@383: typename ResGW::template NodeMap<int> pred(res_graph); marci@315: } marci@315: }; marci@315: marci@315: int main(int, char **) { marci@315: ListGraph G; marci@315: MaxFlow<ListGraph> max_flow_test(G); marci@315: max_flow_test.augmentOnShortestPath(); marci@315: return 0; marci@315: }