Boost logo

Ublas :

From: Jan Amtrup (Jan_Amtrup_at_[hidden])
Date: 2005-09-20 18:49:27


Hello,

I am trying to use a mapped vector with the map array storage variant, and
I'm running
Into trouble with Microsoft Visual Studio 7.1. Consider:

  #include <boost/numeric/ublas/vector_sparse.hpp>
  void main( int argc, char **argv) {
    using namespace boost::numeric::ublas;
    mapped_vector<float, map_array<std::size_t, float> > y( 10);
    return 0;
  }

Using Microsoft Visual Studio 7.1, this results in an error:
c:\Work\DeployRoot\include\boost\numeric\ublas\vector_sparse.hpp(300) :
error C2668: 'boost::numeric::ublas::detail::map_reserve' : ambiguous call
to overloaded function

The culprit are two versions of map_reserve, one more specialized than the
other. In
Version 6.0 of the Microsoft compiler, template specialization was a
thorny issue, it
seems, but I haven't found anything about 7.1 in this regard.

I tried to come up with some other examples, and it gets stranger. If you
have a
function with one argument, specialization seems to work:

  template<class Container>
  void xx( Container& cont)
  {}
  template<class Scalar>
  void xx( std::vector<Scalar>& cont)
  {}

  void main( int argc, char **argv) {
    std::vector<int> vi;
    xx( vi);
  }
Compiles fine.

If you have a function with two arguments, it fails:

  template<class Container>
  void xx2( Container& cont, typename Container::value_type sc)
  {}
  template<class Scalar>
  void xx2( std::vector<Scalar>& cont, Scalar sc)
  {}

  void main( int argc, char **argv) {
    std::vector<int> vi;
    xx2( vi, (int) 5);
  }
Results in an error complaining about an ambiguous overload to the call of
xx2.

Am I doing something wrong, or does anybody have a workaround for this?
Currently, we resort to only using mapped_vectors
with the standard map as container, but eventually we want to use
map_arrays...

Thanks,
Jan.