$include_dir="/home/hyper-archives/boost/include"; include("$include_dir/msg-header.inc") ?>
From: walter_at_[hidden]
Date: 2001-08-29 12:50:56
--- In boost_at_y... <mailto:boost_at_y...>, Kresimir Fresl < fresl_at_g...
<mailto:fresl_at_g...>> wrote:
> On Monday 27 August 2001 20:32, walter_at_g... wrote:
>
> > Kresimir Fresl wrote:
>
> > > I attached the diff files. Maybe they can be useful.
>
> > Thanks a lot. I incorporated most of your changes and compiled
with
> > GCC 2.95.2. I hope, that we do not have to differentiate between
> > 2.95.2 and 3.0. We'll check the new version into CVS ASAP.
>
> Please note that I hacked the templated types in declarations
> of `prec_prod' in matrix_et.h (which were obviously result of
> bad cut&paste) just to make tests compile; it's possible
> that that's not what you intended.
Yep.
>
> There's one more thing which I noticed in my examples:
>
> matrix.h should include vector.h.
>
> Otherwise, if one uses only matrix.h (without previous inclusion
> of vector.h), `forward' and `backward' remain undefined.
Will be done, thanks for the hint.
> BTW, do you plan to add const versions of functions
> matrix<>::row(), matrix<>::column() and matrix<>::project()
> (which probably means introduction of corresponding
> types const_matrix_row<> etc.) ?
To understand the problem (and its consequences :-) I wrote a little
sample. Here is a mutable vector range
numerics::vector<double> v1 (1);
numerics::vector_range<numerics::vector<double> > vr1 (v1.project
(0, 1));
vr1 (0) = 0;
std::cout << vr1 (0) << std::endl;
To get const correctness, you would like to write
const numerics::vector<double> v2 (v1);
// numerics::vector_range<const numerics::vector<double> > vr2
(v2.project (0, 1)); // Compile time error: 2 overloads have no legal
conversion for 'this' pointer
which is currently not possible. So if we extend
class vector {
// other stuff...
typedef const vector<T, F, A> const_self_type;
typedef vector<T, F, A> self_type;
typedef vector_range<const_self_type> const_vector_range_type;
typedef vector_range<self_type> vector_range_type;
const_vector_range_type project (size_type start, size_type
stop) const;
vector_range_type project (size_type start, size_type stop);
const_vector_range_type project (const range &r) const;
vector_range_type project (const range &r);
// more stuff...
};
the vector range is definable
const numerics::vector<double> v2 (v1);
numerics::vector_range<const numerics::vector<double> > vr2
(v2.project (0, 1));
// vr2 (0) = 0; // Compile time error: Conversion loses qualifiers
// std::cout << vr2 (0) << std::endl; // Compile time error:
Conversion loses qualifiers
but access to the range does not compile. However a const vector range
const numerics::vector<double> v3 (v1);
const numerics::vector_range<const numerics::vector<double> > vr3
(v3.project (0, 1));
// vr3 (0) = 0; // Compile time error: left operand must be l-
value
std::cout << vr3 (0) << std::endl;
should give us some kind of const correctness.
I currently would not like to introduce classes like
const_vector_range, because that could result in more source code or
more complex template constructions.
Regards
Joerg