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: }