Boost logo

Boost :

From: Rob Stewart (stewart_at_[hidden])
Date: 2005-06-28 15:33:00


From: Michael Stevens <mail_at_[hidden]>
>
[snip]
> template<class V>
> void hard (V &data, const typename vector_range<V>::range_type &r)
> {}
> template<class V>
> void hard (vector_slice<V> &data, const typename vector_slice<V>::range_type
> &r)
> {}
>
> main ()
> {
> vector_slice<int> vs;
> simple (vs, range() );
> hard (vs, range() );
> }
>
> There are no problems with the functions 'simple'.
> It thinks the functions 'hard' are ambiguous despite the fact that the first
> parameter is more specialised in the second version. It seems to be disturbed
> by template parameter dependence of the second parameter.
>
> Anyone know of a workaround?

What about shifting "const" around?

   template <class V>
   void hard(V &data,
      typename vector_range<V>::range_type const &r)
   {}

   template <class V>
   void hard(vector_slice<V> &data,
      typename vector_slice<V>::range_type const &r)
   {}

What about putting them in a class template? Then you could
introduce typedefs to simplify the expressions the compiler must
grok.

(WARNING: No compiler has had opportunity to comment on the
following code.)

   template <class V>
   struct hard_helper
   {
      typedef typename vector_range<V>::range_type range_type;

      void apply(V &data, range_type const &r)
      {}
   };

   template <class V>
   struct hard_helper<vector_slice<V> >
   {
      typedef typename vector_slice<V>::range_type range_type;

      void apply(V &data, range_type const &r)
      {}
   };

   template <class V, class R>
   inline void hard(V &data, R const &r)
   {
      hard_helper<V>::apply(data, r);
   }

-- 
Rob Stewart                           stewart_at_[hidden]
Software Engineer                     http://www.sig.com
Susquehanna International Group, LLP  using std::disclaimer;

Boost list run by bdawes at acm.org, gregod at cs.rpi.edu, cpdaniel at pacbell.net, john at johnmaddock.co.uk